0

我有两个线程共享一个关键部分。线程 A 永久保持对临界区的锁定,但每秒运行大约 50 次以下代码,以使线程 B 有机会介入:

LeaveCriticalSection(sec);
EnterCriticalSection(sec);

然而,使用这段代码,线程 B 似乎永远没有机会获得临界区。相反,线程 B 中对 EnterCriticalSection(sec) 的调用将永远阻塞该线程,尽管线程 A 每秒解锁临界区 50 次。

我知道线程 A 中 50hz 计时器中对 LeaveCriticalSection() 和 EnterCriticalSection() 的调用之间的间隔尽可能短,但我希望 LeaveCriticalSection() 调用能够让其他线程在关键部分等待在继续执行之前。

LeaveCriticalSection() 不应该像这样工作吗?如果是这样,有没有办法在释放临界区锁后显式让步给其他线程?POSIX 有类似 sched_yield() 的东西,但我认为在 POSIX 上什至没有必要,因为 pthread_mutex_unlock() 会给其他线程一个自动介入的机会。

但它似乎在 Windows 上不起作用(或者我的代码有问题)。任何人都可以对此有所了解吗?

谢谢!

4

2 回答 2

3

线程 A 可能需要通过一个Sleep(0)或类似的调用来产生它的时间片。临界区操作通常停留在用户模式代码中,因此它们不会转换到内核,因此不会放弃线程 A 的时间片。

于 2013-09-20T19:40:19.697 回答
0

如果您想在如此紧密的循环中屈服,您可能可以使用互斥锁而不是临界区来实现(免责声明:我尚未验证)。

于 2013-09-22T14:02:33.150 回答