【发布时间】:2013-09-26 07:14:29
【问题描述】:
我有两个线程共享一个临界区。线程 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 上不起作用(或者我的代码有问题)。任何人都可以对此有所了解吗?
谢谢!
【问题讨论】:
-
为什么线程A需要永久锁定临界区?为什么不像其他线程那样锁定和解锁呢?
标签: multithreading winapi posix