【问题标题】:C program not to allow more than n threads to execute simultaneously a function fC程序不允许超过n个线程同时执行一个函数f
【发布时间】:2017-01-09 18:17:34
【问题描述】:

使用锁/条件变量如何使 C 程序的结构不允许超过 n 个线程同时执行函数体 f?假设您有 60 个创建的线程,一次只允许 10 个进入在函数中。你能把伪代码写成一般的想法吗?

【问题讨论】:

标签: c multithreading locking pthreads condition-variable


【解决方案1】:

您需要一个互斥体、一个条件变量和一个整数。

  1. 获取互斥体。
  2. 当整数为 10 时,阻止条件变量。
  3. 增加整数。
  4. 释放互斥锁。
  5. 调用函数。
  6. 获取互斥体。
  7. 递减整数。
  8. 广播条件变量。
  9. 释放互斥锁。

【讨论】:

  • 当信号量存在时,这听起来像是一种非常迂回的做事方式。
  • @TimČas 我认为这是对信号量的滥用。信号量适用于一个任务产生某些东西而另一个任务消耗它的情况。将它们用作障碍是丑陋的。请参阅this article 了解更多信息。
  • 信号量用于控制对有限资源的访问(例如,最多 10 个运行函数)。这是什么。
  • 作为一种优化,您可以安全地向条件变量发出信号,而不是广播它(每个等待的线程都在等待相同的条件,每次递减最多允许一个线程继续前进)。跨度>
【解决方案2】:

正如@zwol 所建议的,信号量非常适合这项工作:

  • 您创建信号量时,其初始值是函数在任何给定时间允许的线程数。
  • 函数所做的第一件事是在信号量上执行sem_wait()
  • 您确保在每个可能的代码路径上,函数在返回之前只执行一次sem_post()

【讨论】:

  • @DavideVisentin,在这种情况下,究竟什么是“锁”?不是互斥锁——或者至少,不清楚它是否应该是互斥锁。我将这个问题解释为询问一般如何使用同步对象,其中“锁”和条件变量被命名为示例。
猜你喜欢
  • 2016-10-01
  • 2012-04-27
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多