2016-09-01 106 views
0

使用锁定/条件变量如何让C程序的结构不允许超过n个线程同时执行函数f的主体?假设你有60个创建线程,并且只允许10个函数一次输入。你可以用一个普通的想法写成伪代码吗?C程序不允许超过n个线程同时执行函数f

+4

您在寻找[semaphores](http://linux.die.net/man/3/sem_wait)。 – zwol

回答

2

您需要一个互斥锁,一个条件变量和一个整数。

  1. 获取互斥量。
  2. 虽然整数是10,但在条件变量上阻塞。
  3. 递增整数。
  4. 释放互斥锁。
  5. 调用该函数。
  6. 获取互斥量。
  7. 递减整数。
  8. 广播条件变量。
  9. 释放互斥锁。
+0

当信号量存在时,这听起来像是一种非常迂回的做事方式。 –

+0

@TimČas我会认为这是一个滥用信号量。信号量适合于一个任务产生某种东西而另一个任务消耗它。用它们作为屏障是丑陋的。请参阅[本文](http://www.barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore)了解更多信息。 –

+1

信号量用于控制对有限数量资源的访问(例如,最多10个正在运行的功能)。这是什么。 –

2

旗号,作为@zwol建议,是非常适合这项工作:

  • 你与它的初始值是线程数,以允许功能在任何给定的时间创建信号灯。
  • 函数的第一件事是在信号量上执行sem_wait()
  • 您确保在每个可能的代码路径上,该函数在返回之前仅执行一次sem_post()
+0

@DavideVisentin,在这种情况下究竟是一个“锁”?不是互斥锁 - 至少,它不应该是一个互斥锁。我将这个问题解释为询问如何使用同步对象,其中“锁”和条件变量被命名为示例。 –