有类似经历的来,主线程在调用pthread_cancel后调pthread_join会停住。

慕少艾 2013-02-22 04:13:34
有类似经历的来,主线程在调用pthread_cancel后调pthread_join会停住,什么原因导致的?
这个子线程不知道都继承了什么,现在只有个子线程的id。
...全文
227 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
慕少艾 2013-02-22
  • 打赏
  • 举报
回复
引用 8 楼 qq120848369 的回复:
引用 7 楼 smartdota 的回复:引用 6 楼 qq120848369 的回复:全局static sig_atomic_t shut_thread = 0; 然后杀信号就设置为1, 然后每个while(1)改成while(!shut_thread)。 已经说了 子线程循环一次十几秒, 时效性太差了。 那while里是在干吗?
while里是个流水帐。 现在弄了个基于signal的实现,但是是个异步的,有没有隐患还不清楚。 子线程通过sigaction重注一下某个signal的回调函数,回调里面是pthread_exit. 主线程通过pthread_kill sent signal。
qq120848369 2013-02-22
  • 打赏
  • 举报
回复
引用 7 楼 smartdota 的回复:
引用 6 楼 qq120848369 的回复:全局static sig_atomic_t shut_thread = 0; 然后杀信号就设置为1, 然后每个while(1)改成while(!shut_thread)。 已经说了 子线程循环一次十几秒, 时效性太差了。
那while里是在干吗?
慕少艾 2013-02-22
  • 打赏
  • 举报
回复
引用 6 楼 qq120848369 的回复:
全局static sig_atomic_t shut_thread = 0; 然后杀信号就设置为1, 然后每个while(1)改成while(!shut_thread)。
已经说了 子线程循环一次十几秒, 时效性太差了。
qq120848369 2013-02-22
  • 打赏
  • 举报
回复
全局static sig_atomic_t shut_thread = 0; 然后杀信号就设置为1, 然后每个while(1)改成while(!shut_thread)。
慕少艾 2013-02-22
  • 打赏
  • 举报
回复
引用 4 楼 qq120848369 的回复:
方法很多啊, 设置个变量子线程定时查看就行了. 看你线程里做什么了, 做的事情不一样方法不一样. 靠cancel退出纯属扯淡, 没人这样做的.
所以让你提供点退出的方法啊。 子线程在跑一个while(1) 而且循环一次得十几秒,中间没有cancel点。 主线程要终止子线程,要立刻终止,异步的也行。
qq120848369 2013-02-22
  • 打赏
  • 举报
回复
方法很多啊, 设置个变量子线程定时查看就行了. 看你线程里做什么了, 做的事情不一样方法不一样. 靠cancel退出纯属扯淡, 没人这样做的.
慕少艾 2013-02-22
  • 打赏
  • 举报
回复
引用 2 楼 qq120848369 的回复:
照你说的, 很明显就是线程没退出, 先确定线程允许cancel吧。
应该是没有cancel点, 但是子线程里的loop比较长,手动设置一个取消点的话,时效性不强,设置太多的取消点可能会影响loop的速度。 有什么其他的办法可以 管理这个线程?
qq120848369 2013-02-22
  • 打赏
  • 举报
回复
照你说的, 很明显就是线程没退出, 先确定线程允许cancel吧。
qq120848369 2013-02-22
  • 打赏
  • 举报
回复
不可能,检查程序吧.

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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