Multithreading 使用临界段的线程间同步

Multithreading 使用临界段的线程间同步,multithreading,events,synchronization,message,critical-section,Multithreading,Events,Synchronization,Message,Critical Section,我有多个线程,ThreadA和ThreadsB-Z ThreadA总是处于临界区,将数据从队列中弹出并在套接字上发送 当从ThreadB到ThreadZ的任何线程想要进入临界段时,它希望ThreadA只在此时离开临界段。然后它进入临界区,将一些数据推入队列,然后离开临界区 我这里有两个问题: ThreadB-Z(任何想要进入关键区域的人)将如何操作 告诉ThreadA在需要时离开临界区 访问关键部分 我试着用SetEvent或PostThreadMessage来告诉大家 threadA想离开关键

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

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

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

我这里有两个问题:

  • ThreadB-Z(任何想要进入关键区域的人)将如何操作 告诉ThreadA在需要时离开临界区 访问关键部分
  • 我试着用SetEvent或PostThreadMessage来告诉大家 threadA想离开关键区域,但我无法处理 自ThreadA连续弹出以来的任何事件或线程消息 使用while(1)将数据移出队列,并且没有消息循环或 WaitforSingleObject()类型处理事件或线程消息的对象 :(
  • 我好像被困在这种情况下。欢迎提供任何帮助/建议。提前感谢。

    这里真正的问题是“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
    微软的一句名言:“当你使用任何类型的多线程时,你可能会暴露出非常严重和复杂的错误”[来源: