免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: osmanthusgfy
打印 上一主题 下一主题

C++封装pthread问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-11-03 14:33 |只看该作者
你的类没错。
只是你没搞明白栈,堆创建对象和线程的关系,还有就是如何在线程结束时清理对象。这些 ...
chenzhanyiczy 发表于 2010-11-03 14:10


谢谢!!!

栈,堆创建对象和线程的关系,如何在线程结束时清理对象.

这些东东我都明白,我对我这种封装不满

很明显的是:解决了一个问题又引出新的问题

特被是必须强制在堆上创建对象的问题让我很纠结

boost thread和zthread都没有强制,不知到他们是怎么搞的.

万一不行,只有研究这两个库的代码了.

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
12 [报告]
发表于 2010-11-03 14:56 |只看该作者
本帖最后由 chenzhanyiczy 于 2010-11-03 15:14 编辑
谢谢!!!

栈,堆创建对象和线程的关系,如何在线程结束时清理对象.

这些东东我都明白,我对我这种封 ...
osmanthusgfy 发表于 2010-11-03 14:33



你的意思是,你不想在堆上创建又不想全局,只想在栈上分配?
如果这样的话,那就下面:
void* THREAD_CALL ThreadBase::ThreadFunc( void* aArg )
{
        ThreadBase* self = static_cast<ThreadBase*>( aArg );
      ThreadBase a =*self ;      < 当然这里方法有很多>
        a.Run();
        //pthread_exit( (void*)0 );
        return NULL;
/*        return (void*)0;*/
}
但这种情况还有问题,就是主线程太快的话,子线程没有调度机会的话,一样会出错。 这时你可以用信号量来通知主线程结束或者ThreadBase设置一个静态变量,每个对象都更新它,等到满足条件时,主线程才退出

或者将ThreadBase 析构函数变成private的试试,但我觉得这种方法可能问题也有很多

论坛徽章:
0
13 [报告]
发表于 2010-11-03 15:05 |只看该作者
对象在堆上和栈上无所谓,但你要保证你新建的thread资源是有效的。
boost的解决办法是用functional,thread里传入了一个functional的指针,在线程�退出退出退出aaa
退出时析构。

论坛徽章:
0
14 [报告]
发表于 2010-11-03 15:12 |只看该作者
你的意思是,你不想在堆上创建又不想全局,只想在栈上分配?
如果这样的话,那就下面:
void* THREA ...
chenzhanyiczy 发表于 2010-11-03 14:56



至于对象分配,我想做到能够自由选择,而不用固定死.

看了下boost thread传递是函数指针,如果使用某些成员变量又困难多了.


唉,看来c++的多线程编程确实难搞

论坛徽章:
0
15 [报告]
发表于 2010-11-03 15:19 |只看该作者
不是函数指针。 你再看。

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
16 [报告]
发表于 2010-11-03 15:20 |只看该作者
至于对象分配,我想做到能够自由选择,而不用固定死.

看了下boost thread传递是函数指针,如果使用某 ...
osmanthusgfy 发表于 2010-11-03 15:12



想了想,之前我12楼说的有点错误。因为:

对象是在栈上分配的,每个线程有一个独立的栈。main完成后,对象就over了,况且跨越了各自线程的栈的边界去访问其他栈就有可能导致不正确的行为。

根据上面,这样看来你代码确实有问题。

论坛徽章:
0
17 [报告]
发表于 2010-11-03 15:25 |只看该作者
想了想,之前我12楼说的有点错误。因为:

对象是在栈上分配的,每个线程有一个独立的栈。main完成后 ...
chenzhanyiczy 发表于 2010-11-03 15:20


怎样修改?
谢谢!!!

论坛徽章:
0
18 [报告]
发表于 2010-11-03 15:28 |只看该作者
boost的代码太渣。 看g++里的thread实现。

论坛徽章:
0
19 [报告]
发表于 2010-11-03 15:51 |只看该作者
谢谢楼上的.
比较有趣的是:
boost thread也必须在main中调用join或则sleep

论坛徽章:
1
申猴
日期:2014-02-11 14:50:31
20 [报告]
发表于 2010-11-03 17:22 |只看该作者
本帖最后由 chenzhanyiczy 于 2010-11-03 17:33 编辑
谢谢楼上的.
比较有趣的是:
boost thread也必须在main中调用join或则sleep
osmanthusgfy 发表于 2010-11-03 15:51



    所以说,要使用主线程创建的类必须join,否则主线程退出时,对象就销毁了,自然就运行错误了。

所以,lz这样设计确实有问题,主线程和子线程不能同时使用一个栈对象
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP