Multithreading 使用临界段的线程间同步
我有多个线程,ThreadA和ThreadsB-Z ThreadA总是处于临界区,将数据从队列中弹出并在套接字上发送 当从ThreadB到ThreadZ的任何线程想要进入临界段时,它希望ThreadA只在此时离开临界段。然后它进入临界区,将一些数据推入队列,然后离开临界区 我这里有两个问题: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想离开关键
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