Beeing一個線程noob,我試圖找到一種方式無鎖定對象,允許我排隊一個線程池任務,以這樣的方式,它的最大並行度= 1。Interlocked.Exchange有多安全?
此代碼做我認爲它的作用?
private int status;
private const int Idle = 0;
private const int Busy = 1;
private void Schedule()
{
// only schedule if we idle
// we become busy and get the old value to compare with
// in an atomic way (?)
if (Interlocked.Exchange(ref status, Busy) == Idle)
{
ThreadPool.QueueUserWorkItem(Run);
}
}
也就是說,在排隊的Run
方法如果狀態是Idle
一個線程安全的方式。 它似乎在我的測試中工作正常,但由於這不是我的區域,我不確定。
沒問題,假設Run()知道要以線程安全的方式選擇什麼工作。你需要一個真正的鎖。將其重新設置爲空閒是更關鍵的操作,因爲即使線程中止並且您可能想要再次等待正在運行的等待作業,也需要保證絕對可靠。 –
謝謝,我在正確的軌道上,然後,運行方法從'ConcurrentQueue'中選擇它的工作' –