社区
进程/线程/DLL
帖子详情
线程参数、返回值的内存管理问题...
Cacar
2008-09-13 08:22:21
比如处理数据的时候,在子线程中计算出结果,并为结果分配空间(不在主线程中分配空间是因为结果大小未知),将结果返回给主线程以后,要由主线程释放子线程中分配的空间么?感觉这样做有点别扭,但一时想不到更合适的办法,想听听大家的意见....
...全文
85
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里的内容会自动析构
王晓华-吹泡泡的小猫
2008-09-13
打赏
举报
回复
尽量使用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
打赏
举报
回复
注意同步就没问题。
C++编程实例100篇
C++编程实例100篇C++编程实例100篇C++编程实例100篇C++编程实例100篇
python多
线程
编程,获取各个
线程
返回值
及相关
问题
针对使用multiprocessing.Process() 的多
线程
机制获取
返回值
的方法:multiprocessing.Manager(),构造
线程
返回结果存储结构,本质是共享内存具体方法样例: 但是,当返回数据非常大的时候,当
线程
执行完毕,存储结果时会报错,实验平台(vscode,centos 7).目前还没找到解决方法。 2. multiprocessing.Pool() 使用另外一种方法 multiprocessing.Pool() ,可以解决返回数据过大
问题
,目前实验没有出现
问题
:
c语言多
线程
返回值
以及内存回收的
问题
c语言多
线程
返回值
以及内存回收的
问题
背景 昨天在写一个C语言的多
线程
小程序,要求不出现内存泄漏,其中用到了valgrind检测内存是否泄漏,这个工具只在面试的时候了解过,并没有用过,这次正好接触到了,觉得比较有意思,所以这里记录成博客。 为便于写博客,在这里将题目稍作修改: 主
线程
获得一个入参n,创建n个子
线程
,并给子
线程
传递一个
参数
i (i为1,2,3,,,,n),子
线程
计算 i 平方,并将结果返回给主
线程
,主
线程
将各个子
线程
的结果进行累加,得到最终结果,要求不出现内存泄漏。 知识点:多
线程
,
参数
传递
C++,当函数
参数
或者
返回值
是对象......(★firecat推荐★)
文章来源:http://blog.chinaunix.net/uid-20816252-id-2791683.html 如果函数的传入
参数
和
返回值
是对象,那么这个过程中会发生哪些我们未曾注意过的细节呢? 我在VS2008下做了如下实验,并做出了简单的分析,有不足或者不准确的地方,欢迎大家拍砖,我会及时修正相关内容。 一、函数的传入
参数
是对象。 #
线程
终止——
线程
的
返回值
线程
终止 如果进程中的任一
线程
调用了exit,_Exit或者_exit,那么整个进程就会终止。与此类似,如果信号的默认动作是终止进程,那么,把该信号发送到
线程
会终止整个进程。 单个
线程
可以通过下列三种方式退出,在不终止整个进程的情况下停止它的控制流。 (1):从启动例程中返回,
返回值
是
线程
的退出码 (2):
线程
可以被同一进程中的其他
线程
取消 (3):
线程
调用
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章