1

我正在尝试WaitForSingleObject(fork[leftFork], Infinite);使用多个线程来锁定一个变量,但它似乎没有锁定任何东西

我设置Handle fork[5]然后使用下面的代码,但它似乎没有锁定任何东西。

while(forks[rightFork] == 0 || forks[leftFork] == 0) Sleep(0);
WaitForSingleObject(fork[leftFork], INFINITE);
forks[leftFork]--;

WaitForSingleObject(fork[rightFork], INFINITE);
forks[rightFork]--; 

我也尝试过WaitForMultipleObjects同样的结果。当我创建我使用的互斥锁时fork[i]= CreateMutex(NULL, FALSE,NULL);

我想知道这是否只对每个线程都有好处,或者他们是否共享它?

4

1 回答 1

3

首先,您没有显示足够的代码让我们能够帮助您确定正确性。但是,既然做了这个附带条件,我还是要试试!

您对fork一词的使用向我表明您正在从 pthreads 后台处理 Windows 线程。Windows 线程有点不同。相当令人困惑的是,Windows 中最有效的进程内互斥对象不是互斥对象它实际上是临界区

临界区的接口使用起来要简单得多,它本质上是一个获取函数和一个相应的释放函数。如果您在单个进程中进行同步,并且需要一个简单的锁(而不是信号量),那么您应该使用临界区而不是互斥锁。

事实上,就在昨天在 Stack Overflow 上,我为一个描述关键部分的标准使用模式的问题写了一个更详细的答案。那篇文章有很多指向 MSDN 文档相关部分的链接。

话虽如此,看来您要做的只是同步整数值数组的递减。如果是这样,那么您可以最简单地与InterlockIncrement它的朋友或它的一个朋友以无锁的方式做到这一点。

您只需要在执行跨进程同步时使用互斥锁。实际上,您应该只在跨进程同步时使用互斥锁,因为关键部分的性能要好得多(即更快)。由于您在这里更新了一个简单的数组,并且由于没有明显可见的 IPC 正在进行,我只能得出结论,这确实是在进行中。

如果我错了,并且您确实在进行跨进程工作并且需要互斥锁,那么我们将需要查看更多代码。例如,我没有看到任何对ReleaseMutex. 我不确切知道您是如何创建互斥锁的。

如果这没有帮助,请编辑您的问题以包含更多代码,以及您要实现的目标的高级概述。

于 2011-02-21T22:34:45.960 回答