【问题标题】:Mutex ownership queue order互斥体所有权队列顺序
【发布时间】:2013-03-13 19:57:27
【问题描述】:

假设我有三个线程都通过互斥锁访问同一个互斥部分。

让我举个例子。

第一个线程探测互斥体并首先获得其所有权:

//THREAD 1
//TIME: 2013-03-13 01:00:00.000Z
WaitForSingleObject(hMutex, INFINITE);

//Performs the operation that lasts 50 ms

ReleaseMutex(hMutex);

然后 10 毫秒后线程 2 也请求它:

//THREAD 2
//TIME: 2013-03-13 01:00:00.010Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);

20 毫秒后线程 3 也请求它:

//THREAD 3
//TIME: 2013-03-13 01:00:00.030Z
WaitForSingleObject(hMutex, INFINITE);
//Do work
ReleaseMutex(hMutex);

在这种情况下,我是否可以确定线程 2 将始终在线程 3 之前获得互斥锁所有权(因为它可以说是“排在首位”),还是完全任意获得线程 2 和线程之间的所有权? 3?

如果互斥量是任意的,如何确保第一个等待的线程首先获得所有权?

【问题讨论】:

标签: c++ winapi synchronization mutex


【解决方案1】:

可以肯定地说,出于您的目的,操作系统将唤醒等待 Mutex 的线程之一并将其授予线程,但对于哪个线程的决定是不确定的.

您可以使用全局优先级索引在线程之间实现自己的优先级方案。然后,如果一个等待 Mutex 的线程在不是 first-in-line 的情况下接收到它,它会立即放弃它并继续等待,直到 Mutex 再次可用。这应该重复,直到获取 Mutex 并且线程是 first-in-line 根据线程的优先级索引与全局索引相比。

【讨论】:

    【解决方案2】:

    在 Vista 和 Windows Server 2003 SP1 之前,锁定原语试图提供公平 (FIFO)。由于公平导致锁车队,自 Vista 和 Windows Server 2003 SP1 以来,锁定原语明显不公平(无 FIFO)。请参阅Anti-convoy locks in Windows Server 2003 SP1 and Windows Vista 和链接的文章。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多