0

我有多个线程,ThreadA 和 ThreadsB-Z。

ThreadA 始终处于临界区,将数据从队列中弹出并在套接字上发送。

当从ThreadB 到ThreadZ 的任何线程要进入临界区时,它才希望ThreadA 离开临界区。然后它进入临界区,将一些数据推入队列并离开临界区。

我这里有两个问题:

  1. ThreadB-Z(想进入临界区的人)如何告诉 ThreadA 在要访问临界区时离开临界区。
  2. 我尝试使用 SetEvent 或 PostThreadMessage 的想法来告诉 threadA 离开临界区,但我无法处理任何事件或线程消息,因为 ThreadA 使用 while(1) 不断地将数据从队列中弹出并且没有消息循环或 WaitforSingleObject() 类型的东西来处理事件或线程消息:(

我就像陷入了这种境地。欢迎任何帮助/建议。提前致谢。

4

1 回答 1

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

在我看来,使用临界区时应遵守以下一般经验法则:

  • 尽快进入和退出临界区(即尽量减少临界区的代码量)。
  • 使用临界区来保护资源/资产(例如共享内存、队列、列表等)
  • 避免使用临界区来保护函数/方法调用。如果您从关键部分进行函数/方法调用......您正在增加创建死锁的可能性。
  • 避免尝试从临界区中锁定临界区。不这样做可能会导致您的应用程序中出现潜在的死锁。
  • 避免在临界区尝试访问外部资源(例如执行数据库 SQL 查询)。
  • 在有意义的地方,我通常喜欢对关键部分使用以下命名约定:如果被保护的资产被调用messageQueue......那么我将命名关键部分messageQueueLock

来自 Microsoft 的精彩引用:“当您使用任何类型的多线程时,您可能会将自己暴露在非常严重和复杂的错误中”[来源:MSDN]

于 2013-06-04T12:48:02.587 回答