469826336 发表于 2019-9-16 23:33:16

Linux父线程和子线程中分别创建一个对象的问题

本帖最后由 469826336 于 2019-9-17 19:31 编辑

这几天一直看陈硕的《linux多线程服务端编程》Eventloop类设计,其遵循one loop per thread原则,然后作者为了验证现有功能编写了两个实例,然后我就一直卡住在这了。

第一个实例是编写了s00/test1.cc,它在主线程和子线程分别创建一个Eventloop,然后程序正常运行退出。
第二个实例是编写了s00/test2.cc,它在主进程创建一个Eventlooop对象,却试图在另一个线程调用其Eventloop::loop(),程序会因断言而异常终止。

我的问题是:
1.第一个实例为什么子进程不会出错,子进程创建Eventloop对象时的t_loopInThisThread变量不应该不为空吗。然后我今天发现它创建子进程的方法是用的pthread_create,在网上搜了下发现和fork有区别,是因为这个区别导致的吗。
2.第二个实例报错是因为pthread_create出来的子进程和父进程共享全局变量g_loop的threadId_这个成员导致的吗。

如果有大佬愿意花时间解说下,小子在此感激不尽{:5_105:} ,下面是一些相关的源码。

Eventloop的部分实现
http://m.qpic.cn/psb?/V13DnKFA2b7guU/QZbRTvffs5iaY3iO7LY5XuMflcVUkiUxblbE3FAy4.Q!/b/dFMBAAAAAAAA&bo=UgKvAAAAAAADF80!&rf=viewer_4
http://m.qpic.cn/psb?/V13DnKFA2b7guU/YaFuaaQE5izrTP1LYA0LyZ9sUVaTPmQ2NPTTXqZd9s8!/b/dLYAAAAAAAAA&bo=VwJFAQAAAAADFyM!&rf=viewer_4
http://a3.qpic.cn/psb?/V13DnKFA2b7guU/LZKPY564OvV78wQrmUytxDyWK11TS3N2ls2rVOurtpM!/b/dLYAAAAAAAAA&ek=1&kp=1&pt=0&bo=jwLhAQAAAAADJ28!&tl=1&vuin=469826336&tm=1568642400&sce=60-2-2&rf=viewer_4

Eventloop::loop()的实现
http://a1.qpic.cn/psb?/V13DnKFA2b7guU/y.pHQluM.79YRubyNrq7zQ9RWuCQlqvdZ4rV8*33u1U!/b/dMQAAAAAAAAA&ek=1&kp=1&pt=0&bo=VQLEAAAAAAADF6E!&tl=1&vuin=469826336&tm=1568646000&sce=60-2-2&rf=viewer_4

test1.cc
http://m.qpic.cn/psb?/V13DnKFA2b7guU/PdvkkrDUhEOsuDVqi*ZPGc4yDLh*TVwU8tiulPNPGOA!/b/dL4AAAAAAAAA&bo=lQIvAQAAAAADF4s!&rf=viewer_4
http://m.qpic.cn/psb?/V13DnKFA2b7guU/0W1j6Uy2rpFWYc87QE05htBZpt4iRYF4d4SkPe*EMC8!/b/dL8AAAAAAAAA&bo=jgJBAQAAAAADF*4!&rf=viewer_4

test2.cc
http://m.qpic.cn/psb?/V13DnKFA2b7guU/cJX9yrgf293l4qlTvfF0uWK*hwH7LFTV2QoTuKwUhM4!/b/dL8AAAAAAAAA&bo=iAJ6AQAAAAADF8M!&rf=viewer_4
页: [1]
查看完整版本: Linux父线程和子线程中分别创建一个对象的问题