2
對於標準C++ 11和/或在一般情況下,以下推理是否正確?無鎖線程池
實現線程池時,通常不希望繁忙循環那些沒有工作要做的線程。因此,需要某種std :: condition_variable。因此,需要某種std :: mutex。因此,不可能擁有一個無鎖定的線程池(不佔用循環)。
還是我錯過了一些操作系統機制,這將使它成爲可能?你能否提供額外的推理,表明不存在無鎖非繁忙循環線程池?
對於標準C++ 11和/或在一般情況下,以下推理是否正確?無鎖線程池
實現線程池時,通常不希望繁忙循環那些沒有工作要做的線程。因此,需要某種std :: condition_variable。因此,需要某種std :: mutex。因此,不可能擁有一個無鎖定的線程池(不佔用循環)。
還是我錯過了一些操作系統機制,這將使它成爲可能?你能否提供額外的推理,表明不存在無鎖非繁忙循環線程池?
如果您允許忙碌的等待,那當然完全有可能。但是如果不忙着等待,你需要操作系統的幫助 - 它不必是一個互斥體,它當然可以是一個read
,poll
,WaitForMultipleObject
(在Windows中)或其他「等待某事」功能所提供的功能OS。
我並不是100%確定它不可能提供某些東西,但總的來說,一個線程正在運行,或者它由操作系統等待某些東西。就我所知,「等待操作系統中的某些東西」總是某種「鎖定」。
但是,這裏的關鍵是:
如果在有「無工做」是真的有問題,那麼你或許應該重新考慮你的整體線程池的使用,而不是嘗試的情況下鎖卸下鎖。也許更大的數據包需要通過「爲線程提供工作」來完成。
這個無鎖定線程池https://github.com/tghosgor/threadpool11在飽和情況下是無鎖的,但在沒有工作時使用std :: condition_variable/std :: mutex。 –