我有一個執行緒 t1,它以下列方式將一些資料寫入佇列:
while True:
// generate data
lock (myQueue)
{
myQueue.Enqueue(data);
}
我的主執行緒偶爾會呼叫以下使用佇列資料的函式:
lock (myQueue)
{
if (myQueue.Count == 0) return false;
}
Pose[] frame = myQueue.Dequeue()
注意 dequeue 呼叫是如何未被鎖定的。我的想法是,如果我以鎖定的方式確保長度至少為 1,我的函式將始終讀取一個元素,而另一個執行緒將僅在其同時寫入時寫入該元素后面。這是正確的還是我會遇到執行緒問題,因為它們仍在同時訪問同一個物件?
uj5u.com熱心網友回復:
不,您不允許在沒有同步的情況下從多個執行緒訪問非執行緒安全物件。如果你這樣做,你的程式的行為就會變得不確定。以下是修復代碼的方法:
Pose[] frame;
lock (myQueue)
{
if (myQueue.Count == 0) return false;
frame = myQueue.Dequeue();
}
// Here use the frame
...或更簡潔地說:
Pose[] frame;
lock (myQueue)
{
if (!myQueue.TryDequeue(out frame)) return false;
}
// Here use the frame
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/451970.html