0

我有多个线程,ThreadA和ThreadsB-Z。使用关键部分的线程之间的同步

ThreadA始终处于关键部分,将数据从队列中弹出并将其发送到套接字上。

当从ThreadB到ThreadZ的任何线程都想要进入临界区时,它只希望ThreadA离开临界区。然后进入关键部分,将一些数据推入队列并留下关键部分。

我这里有两个问题:

  1. 将如何ThreadB-Z(凡要进入临界区) 告诉ThreadA中,当它想 访问临界区离开临界区。
  2. 我SetEvent的或PostThreadMessage的想法想告诉 ThreadA中留下的关键部分,但我无法处理 任何事件或主题留言,因为ThreadA中使用,同时不断弹出 数据从队列中(1)并没有消息循环或 WaitForSingleObject的()式的东西来处理事件或主题的消息 :(

我就像被困在这种情况下,任何帮助/建议是值得欢迎的。在此先感谢。

回答

0

这里真正的问题是“ThreadA是alwa ys在关键部分“。 线程A不应无限期锁定临界区。

在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

大报价来自微软:“当你使用任何形式的多线程时,你可能会面临非常严重和复杂的错误”[来源:MSDN]

相关问题