加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Linux线程暂停/恢复

发布时间:2020-12-16 05:29:53 所属栏目:百科 来源:网络整理
导读:我正在编写一个代码,其中我有两个并行运行的线程. 1st是启动第二个线程的主线程. 第二个线程只是一个执行空循环的简单线程. 现在我想暂停/暂停创建它的第一个线程执行第二个线程. 过了一段时间后,我想从暂停/暂停的位置恢复执行第二个线程(通过发出一些命令
我正在编写一个代码,其中我有两个并行运行的线程.

1st是启动第二个线程的主线程.
第二个线程只是一个执行空循环的简单线程.

现在我想暂停/暂停创建它的第一个线程执行第二个线程.
过了一段时间后,我想从暂停/暂停的位置恢复执行第二个线程(通过发出一些命令或功能).

解决方法

这个问题不是关于如何使用互斥锁,而是如何挂起线程.

在Unix规范中有一个名为pthread_suspend的线程函数,另一个名为pthread_resume_np,但由于某些原因,制作Linux,FreeBSD,NetBSD等的人没有实现这些功能.

所以要理解它,功能根本就不存在.有一些解决方法但不幸的是它与在Windows上调用SuspendThread不同.你必须做各种非便携式的东西,使线程停止并开始使用信号.

停止和恢复线程对调试器和垃圾收集器至关重要.例如,我看过Wine的一个版本无法正确实现“SuspendThread”功能.因此任何使用它的Windows程序都无法正常工作.

我认为有可能使用基于JVM使用这种信号技术为垃圾收集器这一事实的信号正确地做到这一点,但我也刚刚看到一些文章在线,人们注意到JVM的死锁等等,有时候不能重放.

因此,要回答这个问题,除非你有一个很好的Unix实现pthread_suspend_np,否则你不能正确地用Unix暂停和恢复线程.否则你会被信号困住.

信号的一个大问题是当你有大约五个不同的库都链接到同一个程序并且所有库都试图同时使用相同的信号时.出于这个原因,我相信你实际上不能在一个程序中使用像ValGrind这样的东西,例如Boehm GC.至少在最低级别的用户空间没有主要编码.

这个问题的另一个答案可能是.做Linuz Torvalds对NVidia所做的事情,转过头来指责他并让他实现Linux中缺少的两个最关键的部分.首先是pthread_suspend,其次是内存页面上的脏位,以便可以实现正确的垃圾收集器.在线开始大量请愿并继续翻转手指.也许在Windows 20发布时,他们会意识到暂停和恢复线程,并且有脏位实际上是Windows和Mac比Linux更好的基本原因之一,或者任何没有实现pthread_suspend的Unix以及脏位在虚拟页面上,如VirtualAlloc在Windows中.

我不生活在希望之中.实际上对我来说,我花了很多年时间计划我的未来为Linux构建东西,但已经放弃了希望作为一个可靠的东西似乎都取决于虚拟内存的脏位的可用性,以及干净地挂起线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读