我正在尝试使用pthreads编写适合我目的的自定义线程池,我是pthreads的新手。我在网上阅读了这些(POSIX threads programming和Linux Tutorial Posix Threads)教程,它们非常有用,但我仍然对互斥和条件变量有一些(可能是愚蠢的)疑问:
pthread_cond_wait()
阻塞)的其他线程。对休眠线程的唤醒调用由来自其他线程的pthread_cond_signal()
或pthread_cond_broadcast()
给出。应该如何控制流程,以便某些全部或一个线程唤醒工作并等待下一个工作可用?我对4线程的场景特别感兴趣。如果问题看起来很傻,我很抱歉,但正如我所说,我是新手。任何帮助,评论,代码或指向良好资源的指针都表示赞赏。提前感谢您的帮助。
答案 0 :(得分:1)
这是很多问题。一些答案。
(1a)互斥体的范围是你编程的任何东西。从这个意义上说,它与任何其他类型的变量没有什么不同。
(1b)全局互斥锁将保护您编程保护的任何变量。我想从你的其他问题来看,你可能会有一个根本的误解。互斥体没有什么神奇之处。你不能只声明一个并说“好,保护这些变量”,你必须在你的代码中加入互斥锁。因此,如果您有两个使用变量X的函数,并且一个函数在变量的任何更改周围执行互斥锁定/解锁,而另一个函数完全忽略了互斥锁甚至存在,您实际上并没有保护任何东西。我能想到的最好的例子是咨询文件锁 - 一个程序可以使用它们,但如果另一个程序没有,那么该文件不会被锁定。
(1c)通常,不要有多个互斥锁来锁定相同的数据。这是对问题的邀请。互斥体的使用再次取决于程序化的合作。如果功能A用互斥锁C保护数据B,而功能D用互斥锁E保护数据B,则数据B根本不受保护。函数A可以锁定互斥锁C,但由于函数D不关注它,它只会覆盖数据B.
(1d)适用基本范围规则。
(2)否。如果变量不会以任何方式改变,使得它在线程之间不一致,那么你就不需要锁定它。
(3)关于此,有很多详细的答案,详细说明了这一点。搜索一下。
(4)不是我知道的。