2016-09-01 107 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,在這種情況下究竟是一個「鎖」?不是互斥鎖 - 至少,它不應該是一個互斥鎖。我將這個問題解釋爲詢問如何使用同步對象,其中「鎖」和條件變量被命名爲示例。 –