【问题标题】:proper threadpool using pthreads使用 pthreads 的正确线程池
【发布时间】:2012-06-16 14:35:40
【问题描述】:

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

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

如果这些问题看起来很愚蠢,我很抱歉,但正如我所说,我是新手。感谢任何帮助、cmets、代码或指向良好资源的指针。提前感谢您的帮助。

【问题讨论】:

    标签: pthreads threadpool mutex condition-variable


    【解决方案1】:

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

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

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

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

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

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

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

    (4) 我不知道。

    【讨论】:

    • 感谢您的回答,尤其是(1b),我有这个误解。 :)
    • 如果你和其他人一样,这将是几个中的第一个。在你理解大部分内容之前需要一些思考、练习和错误,即使这样也很容易被蛇咬。
    猜你喜欢
    • 2014-04-12
    • 2011-10-20
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多