2

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

  1. 互斥锁的范围是什么?全局互斥锁是否会锁定所有全局变量,以便一次只有一个线程可以访问它们?如果我有两个全局互斥锁,它们会锁定同一组变量吗?在类或函数中声明的互斥锁怎么样,当我锁定/解锁它时会发生什么?
  2. 如果我只是打算读取一个全局变量,根本不修改它,我还应该使用互斥锁吗?
  3. 如果我是正确的,则使用条件变量来唤醒pthread_cond_wait()在某些条件下正在休眠(或使用阻塞)的其他线程。对休眠线程的唤醒呼叫由其他线程发出pthread_cond_signal()pthread_cond_broadcast()由其他线程发出。控制流应该如何发生,以便一些全部或一个线程唤醒以完成工作并等待下一个工作可用?我对具有 4 个线程的场景特别感兴趣。
  4. 有没有办法在创建线程之前设置线程与特定处理器核心的亲和性(以便它开始在所需的核心上执行并且在创建后不会发生核心移动)?

如果这些问题看起来很愚蠢,我很抱歉,但正如我所说,我对此并不陌生。任何帮助、评论、代码或指向良好资源的指针都值得赞赏。在此先感谢您的帮助。

4

1 回答 1

1

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

(1a) 互斥锁的范围是您将其编程为的任何内容。从这个意义上说,它与任何其他类型的变量没有什么不同。

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

(1c) 通常,不要让多个互斥锁锁定相同的数据。这是对问题的邀请。再一次,互斥锁的使用取决于编程的合作。如果函数 A 使用互斥锁 C 保护数据 B,而函数 D 使用互斥锁 E 保护数据 B,则数据 B 根本不受保护。函数 A 可以保持对互斥体 C 的锁定,但由于函数 D 不注意它,它无论如何都会覆盖数据 B。

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

(2) 不。如果变量不会以任何方式发生变化,使其在线程之间不一致,那么您不需要锁定它。

(3) 关于 SO 有许多详细的答案,对此进行了相当详细的说明。搜索了一下。

(4) 我不知道。

于 2012-06-13T16:53:01.660 回答