我有多个线程,ThreadA和ThreadsB-Z。
ThreadA始终处于关键部分,将数据弹出队列并在套接字上发送。
当从ThreadB到ThreadZ的任何线程想要进入临界区时,它希望ThreadA只在那时离开临界区。然后它进入关键部分,将一些数据推入队列并留下关键部分。
我有两个问题:
我喜欢陷入这种境地。欢迎任何帮助/建议。提前谢谢。
答案 0 :(得分:0)
这里真正的问题是“ThreadA始终处于关键部分”。 ThreadA 不应无限期地锁定关键部分。
在C#中, ThreadA 的代码类似于:
Message message;
// Only lock critical section for the time it takes to modify the queue
lock(_messageQueueLock){
message = _messageQueue.Dequeue();
}
// do something with the message
在我看来,使用关键部分时应遵守以下一般经验法则:
messageQueue
...那么我会将关键部分命名为messageQueueLock
微软的一句好话:“当你使用任何类型的多线程时,你可能会暴露自己非常严重和复杂的错误”[来源:MSDN]