2012-06-13 46 views
2

我想写一个自定义的线程池适合我的目的使用pthreads,我是新的pthreads。我阅读这些(POSIX threads programmingLinux Tutorial Posix Threads)在线教程,他们是相当有帮助,但我仍然有关于互斥体和条件变量的一些(也许愚蠢的)疑惑:正确的线程池使用pthreads

  1. 什么是互斥的范围是什么?全局互斥锁是否会锁定所有全局变量,以便一次只有一个线程可以访问它们?如果我有两个全局互斥锁,他们会锁定同一组变量吗?如何在类或函数中声明互斥锁,当我锁定/解锁它时会发生什么?
  2. 如果我只是计划只读一个全局变量,而不是修改它,我还应该使用互斥锁吗?
  3. 如果我是正确的,则在某些条件下,使用条件变量唤醒正在睡眠(或使用pthread_cond_wait()进行阻止)的其他线程。唤醒睡眠线程的电话由pthread_cond_signal()pthread_cond_broadcast()从其他某个线程给出。控制流程应该如何发生,以便某些全部或一个线程唤醒以开始工作并等待下一个工作可用?我特别感兴趣的是有4个线程的场景。
  4. 有没有一种方法可以在创建线程之前设置特定处理器核心的线程亲和性(以便它可以在所需的核心上开始执行,并且在创建后不会发生核心转换)?

如果问题看起来很愚蠢,我很抱歉,但正如我所说,我是新手。任何帮助,意见,代码或指向良好的资源表示赞赏。在此先感谢您的帮助。

回答

1

这是很多问题。几个答案。

(1a)互斥锁的范围是您编程的任何东西。从这个意义上讲,它与任何其他类型的变量没有什么不同。 (1b)全局互斥将保护您编程保护的任何变量。我想从你的其他问题你可能在这里有一个根本的误解。互斥体没有什么不可思议的。你不能只声明一个,并说“好,保护这些变量”,你必须在你的代码中加入互斥体。所以,如果你有两个使用变量X的函数,并且在变量的任何变化周围都有一个互斥体锁定/解锁,而另一个函数完全忽略互斥体存在,那么你确实没有保护任何东西。我能想到的最好的例子是咨询文件锁 - 一个程序可以使用它们,但是如果另一个程序没有锁定,那么该文件不会被锁定。

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

(1d)基本范围规则适用。 (2)不可以。如果变量不会以任何方式改变,这将使得它在线程间不一致,那么您不需要锁定它。

(3)关于这个问题有很多详细的答案,在这方面有相当多的细节。搜索一下。

(4)不是我所知道的。

+0

感谢您的回答,特别是(1b),我有这种误解。 :) – Chatter

+0

如果你像其他人一样,它将是第一个。在你将头部缠绕在大部分面前之前,需要一些思考,练习和错误,即使这样很容易得到蛇的位置。 – Duck