使用pthreads的正确线程池

时间:2012-06-13 15:25:28

标签: pthreads threadpool mutex condition-variable

我正在尝试使用pthreads编写适合我目的的自定义线程池,我是pthreads的新手。我在网上阅读了这些(POSIX threads programmingLinux Tutorial Posix Threads)教程,它们非常有用,但我仍然对互斥和条件变量有一些(可能是愚蠢的)疑问:

  1. 互斥锁的范围是什么?全局互斥锁是否会锁定所有全局变量,以便一次只能有一个线程访问它们?如果我有两个全局互斥锁,它们会锁定同一组变量吗?如果在类或函数内声明的互斥锁怎么样,当我锁定/解锁它时会发生什么?
  2. 如果我只打算阅读一个全局变量,而不是完全修改它,我还应该使用互斥锁吗?
  3. 如果我是正确的,条件变量用于唤醒在某些条件下正在休眠(或使用pthread_cond_wait()阻塞)的其他线程。对休眠线程的唤醒调用由来自其他线程的pthread_cond_signal()pthread_cond_broadcast()给出。应该如何控制流程,以便某些全部或一个线程唤醒工作并等待下一个工作可用?我对4线程的场景特别感兴趣。
  4. 有没有办法在创建线程之前将线程的亲缘关系设置为特定处理器核心(以便它在所需的核心上开始执行,并且在创建后不会发生核心移位)?
  5. 如果问题看起来很傻,我很抱歉,但正如我所说,我是新手。任何帮助,评论,代码或指向良好资源的指针都表示赞赏。提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是很多问题。一些答案。

(1a)互斥体的范围是你编程的任何东西。从这个意义上说,它与任何其他类型的变量没有什么不同。

(1b)全局互斥锁将保护您编程保护的任何变量。我想从你的其他问题来看,你可能会有一个根本的误解。互斥体没有什么神奇之处。你不能只声明一个并说“好,保护这些变量”,你必须在你的代码中加入互斥锁。因此,如果您有两个使用变量X的函数,并且一个函数在变量的任何更改周围执行互斥锁定/解锁,而另一个函数完全忽略了互斥锁甚至存在,您实际上并没有保护任何东西。我能想到的最好的例子是咨询文件锁 - 一个程序可以使用它们,但如果另一个程序没有,那么该文件不会被锁定。

(1c)通常,不要有多个互斥锁来锁定相同的数据。这是对问题的邀请。互斥体的使用再次取决于程序化的合作。如果功能A用互斥锁C保护数据B,而功能D用互斥锁E保护数据B,则数据B根本不受保护。函数A可以锁定互斥锁C,但由于函数D不关注它,它只会覆盖数据B.

(1d)适用基本范围规则。

(2)否。如果变量不会以任何方式改变,使得它在线程之间不一致,那么你就不需要锁定它。

(3)关于此,有很多详细的答案,详细说明了这一点。搜索一下。

(4)不是我知道的。