从不同线程访问队列两端时的同步
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
我有一个线程 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