线程参数、返回值的内存管理问题...

Cacar 2008-09-13 08:22:21
比如处理数据的时候,在子线程中计算出结果,并为结果分配空间(不在主线程中分配空间是因为结果大小未知),将结果返回给主线程以后,要由主线程释放子线程中分配的空间么?感觉这样做有点别扭,但一时想不到更合适的办法,想听听大家的意见....
...全文
87 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whoo 2008-09-14
  • 打赏
  • 举报
回复
内存的分配和释放,最好要在同一个线程内执行。

在一个线程中分配,另一个线程中释放是不可取的。


如果情况复杂,可以专开一个内存管理的类。
cattycat 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 orbit 的回复:]
尽量使用Windows的API分配函数,比如GlobalAlloc和HeapAlloc,尽量不要用CRT的malloc和new,它们不是线程安全的
[/Quote]
主线程把指针传给子线程,释放由主进程完成。大多数都是这么实现的。
gaoteng1984 2008-09-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhoujianhei 的回复:]
假如你将结果封装成一个类,由该类分配或释放空间岂不是更容易理解。
[/Quote]
例如:

class Result
{
public:
Result() : data_(NULL), size_(0)
{}

void SetData(size_t newSize, char *newData)
{
if (data_ != NULL)
{
delete data_[];
data_ = NULL;
}
size_ = newSize;
data_ = new char [newSize];
memcpy(data_, newData, data_);
}

char* GetData()
{
return data_;
}

~Result()
{
if (data_ != NULL)
{
delete data_[];
}
}
private:
char *data_;
size_t size_;
};


子线程函数:
DWORD ThreadFunc(PVOID param);
{
Result *pResult = (Result*)param;
...计算出size,填充好buf
pResult->SetData(size, buf);
return 0;
}


主线程函数:
void mainFunc()
{
Result result;
HANDLE hChildThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunc, &result, NULL, NULL);
WaitForSingleObject(hChildThread, INFINITE);
UseData(result.GetData());
}// 该函数返回时,result里的内容会自动析构
  • 打赏
  • 举报
回复
尽量使用Windows的API分配函数,比如GlobalAlloc和HeapAlloc,尽量不要用CRT的malloc和new,它们不是线程安全的
zhoujianhei 2008-09-13
  • 打赏
  • 举报
回复
是有些别扭,假如你将结果封装成一个类,由该类分配或释放空间岂不是更容易理解。
cnzdgs 2008-09-13
  • 打赏
  • 举报
回复
别扭是因为你还没这样做过,这是很常见的做法,习惯了就不别扭了。
oo_v_oo 2008-09-13
  • 打赏
  • 举报
回复
子线程根据计算结果申请空间,采用队列结构,将计算得到的结果数据和数据长度组成的字节流指针添加到队列尾部
主线程提供队列头指针,并且不断的从队列的头部获得数据,处理完后释放空间

此时,同步方式建议采用临界区,而且尽量减少临界区内的代码

这种处理方式在实际应用中有很多,比如网络通信等。
DentistryDoctor 2008-09-13
  • 打赏
  • 举报
回复
注意同步就没问题。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧