【发布时间】:2011-06-16 05:02:26
【问题描述】:
对于线程,是否有与 SIGSTOP 和 SICONT 等价的东西?我正在使用 pthreads。 谢谢
编辑: 我正在线程之间实现一种粗略的文件访问同步形式。因此,如果一个文件已经被一个线程打开,并且另一个线程想要再次打开它,我需要在第二个线程的执行点暂停或暂停第二个线程。当第一个线程完成其工作时,它将检查其他线程想要使用它释放的文件并“唤醒”它们。然后第二个线程从该点恢复执行。我使用自己的簿记数据结构。
【问题讨论】:
对于线程,是否有与 SIGSTOP 和 SICONT 等价的东西?我正在使用 pthreads。 谢谢
编辑: 我正在线程之间实现一种粗略的文件访问同步形式。因此,如果一个文件已经被一个线程打开,并且另一个线程想要再次打开它,我需要在第二个线程的执行点暂停或暂停第二个线程。当第一个线程完成其工作时,它将检查其他线程想要使用它释放的文件并“唤醒”它们。然后第二个线程从该点恢复执行。我使用自己的簿记数据结构。
【问题讨论】:
我将告诉你如何做事,而不是回答问题。 (查找“X Y 问题”。)
您正试图阻止两个线程同时访问同一个文件。换句话说,访问是互斥的。 “互斥锁”旨在做到这一点。一般来说,如果您搜索您正在尝试做的事情(防止两个线程同时访问同一资源)而不是搜索您想要如何做(让一个线程等待另一个),则更容易找到帮助。
编辑:听起来您实际上想要很多读者,但只有一位作者。这可能是第二个最常见的同步问题(在“生产者-消费者”问题之后)。使用pthread_rwlock:读者调用pthread_rdlock,作者调用pthread_wrlock。
如果您正在做如此复杂的事情,您真的应该开始阅读相关文献。如果你认为你可以认真阅读多线程编程,那你比我聪明得多,你不需要我的帮助。我推荐免费下载的“信号量小书”(source)。这与 pthread 无关,但它是好东西。您要询问的读者-作者问题在“经典同步问题”一章的第 4.2 节中找到(见鬼,这个问题甚至在简介中提到)。
多线程编程是HARD大写字母和粗体。
【讨论】:
嗯,有pthread_kill。
但您几乎可以肯定不想这样做。如果另一个线程持有(例如)堆的互斥体,而您尝试在它停止时调用 new 怎么办?
由于您不知道运行时对互斥体做了什么,因此除非您完全避免使用标准库,否则一般无法避免此类问题。
[编辑]
实际上,想一想,如果您使用SIGSTOP 定位特定线程,我不确定会发生什么,因为该信号通常会影响整个进程。
所以更新我的答案,我不相信有任何标准机制可以异步挂起线程......由于上述原因,我认为你不想要一个。
【讨论】:
根据您的应用程序,Pthreads 支持可以被认为更精细的机制,例如 http://www.unix.com/man-page/all/3t/pthread_suspend/ 和 Mutex 机制
【讨论】: