所以我知道你可以使用一個信號量和其他可能的方法來確定一個鎖是否會成功和/或有多少個線程在等待鎖,但是你可以在鎖定自己?如何測試鎖內等待線程
我的情況是我有一個事件處理程序,可以由List
中的許多對象調用。我想在一個鎖內做一個測試,看看在繼續之前所有的對象是否處於正確的狀態。對象過渡到適當的狀態然後引發此事件,因此在單個線程模型中,當最後一個引發此事件時,所有對象都處於正確狀態,我們繼續。但是在我看來,使用多線程時,多個對象可能會轉換到我正在檢查的狀態,但尚未處理此事件,因爲它們正在等待鎖定。因此,鎖內的條件狀態檢查將是真實的,但是直到所有線程完成處理該事件爲止都將繼續執行。我只需要它是真實的,因爲最後一個線程被處理,以確保我們不會太快。
例如,在半寫實代碼:
object _LockObj = new object();
void Event_Handler(object sender, EventArgs e)
{
MyObject originator = sender as MyObject;
if(originator == null)
return;
*Do stuff with the originator*
lock(_LockObj)
{
if(ListOfMyObjects.FindAll(o => o.State == DesiredState)
.Count == ListOfMyObjects.Count
&& *nothing waiting at the lock*)
{
*Proceed*
}
}
}
我完全願意接受我的做法是臭下手,並且我正在尋找解決的辦法是沒有實際意義,如果我在做正確首先,但我不確定如何以線程安全的方式正確執行此操作。
我打算給MyObject
添加更多狀態,並通過在*Do stuff with the originator*
部分設置相應的狀態來管理流程,但是從這裏轉換MyObject並不合適,更不用說我必須實現一個爲每個引發異味變得不簡單的事件狀態持有狀態!
因此,如果有做「沒有設定鎖定等待」檢查那麼這就是我想去除非我失去了一個非常簡單的實現模式,有助於在這種情況下的方式的簡單方法。
您正在尋求一個線程比賽錯誤作爲功能。在你斷定沒有線程正在等待之後的一個納秒內,一個線程可以進入該方法。 –