使用鎖定/條件變量如何讓C程序的結構不允許超過n個線程同時執行函數f的主體?假設你有60個創建線程,並且只允許10個函數一次輸入。你可以用一個普通的想法寫成僞代碼嗎?C程序不允許超過n個線程同時執行函數f
回答
您需要一個互斥鎖,一個條件變量和一個整數。
- 獲取互斥量。
- 雖然整數是10,但在條件變量上阻塞。
- 遞增整數。
- 釋放互斥鎖。
- 調用該函數。
- 獲取互斥量。
- 遞減整數。
- 廣播條件變量。
- 釋放互斥鎖。
當信號量存在時,這聽起來像是一種非常迂迴的做事方式。 –
@TimČas我會認爲這是一個濫用信號量。信號量適合於一個任務產生某種東西而另一個任務消耗它。用它們作爲屏障是醜陋的。請參閱[本文](http://www.barrgroup.com/Embedded-Systems/How-To/RTOS-Mutex-Semaphore)瞭解更多信息。 –
信號量用於控制對有限數量資源的訪問(例如,最多10個正在運行的功能)。這是什麼。 –
旗號,作爲@zwol建議,是非常適合這項工作:
- 你與它的初始值是線程數,以允許功能在任何給定的時間創建信號燈。
- 函數的第一件事是在信號量上執行
sem_wait()
。 - 您確保在每個可能的代碼路徑上,該函數在返回之前僅執行一次
sem_post()
。
@DavideVisentin,在這種情況下究竟是一個「鎖」?不是互斥鎖 - 至少,它不應該是一個互斥鎖。我將這個問題解釋爲詢問如何使用同步對象,其中「鎖」和條件變量被命名爲示例。 –
- 1. 一個函數,只允許N個併發線程
- 2. 執行程序服務 - 線程超時
- 3. 不是允許執行存儲過程
- 4. c#同時執行2個線程
- 5. 執行線程超時
- 6. 只允許兩個線程在一個函數上運行
- 7. 同時處理超過64個線程
- 8. Web服務:只允許一個線程在同一時間執行
- 9. 允許使用execvp執行程序
- 10. []不允許過載C++數組函數
- 11. JAVA通過n執行線程堆棧
- 12. C++線程的執行時間和執行線程在另一個線程
- 13. 執行程序線程繁忙時,Netty IdleStateHandler超時
- 14. 使用N個線程執行後查找執行時間
- 15. 跨線程不允許
- 16. 同時執行2個不同的函數,是線程我的答案?
- 17. pthreads:允許線程數
- 18. boost ::線程函數執行
- 19. 暫停/執行多線程程序中的一個線程(C#)
- 20. Javascript onfocus事件處理程序將只允許我執行一個函數
- 21. 執行多個線程同時
- 22. 爲什麼GIL不允許執行線程代碼?
- 23. C++線程不執行
- 24. 線程執行時序
- 25. fnd一個__global__函數允許的最大塊數/線程數
- 26. 允許執行多個語句,同時通過SQLAlchemy的
- 27. 應用程序事件日誌超過最大允許計數
- 28. 允許只有一個線程通過/不使線程等待不必要
- 29. 如何讓C++ 11線程運行多個不同的函數?
- 30. 爲什麼同步方法允許多個線程同時運行?
您在尋找[semaphores](http://linux.die.net/man/3/sem_wait)。 – zwol