从不同线程访问队列两端时的同步

Synchronization when accessing two ends of a queue from different threads

我有一个线程 t1,它以下列方式将一些数据写入队列:

while True:

  // generate data
  lock (myQueue)
  {            
    myQueue.Enqueue(data);
  }

我的主线程偶尔会调用以下使用队列数据的函数:

lock (myQueue)
{
  if (myQueue.Count == 0) return false;
}

Pose[] frame = myQueue.Dequeue()

注意 dequeue 调用是如何未被锁定的。我的想法是,如果我以锁定方式确保长度至少为 1,我的函数将始终读取该元素,而另一个线程只会在该元素同时写入时写入该元素。这是正确的还是我会 运行 进入线程问题,因为它们仍在同时访问同一个对象?

不,您不能在没有同步的情况下从多个线程访问 non-thread-safe 对象。如果这样做,程序的行为将变得不确定。以下是修复代码的方法:

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