【发布时间】:2015-11-12 08:05:20
【问题描述】:
所以我只是想验证我的理解,希望你们能够消除任何误解。所以本质上我有两个线程使用相同的锁并在它们持有锁时执行计算,但有趣的是在锁内我会导致线程休眠一小段时间。对于两个线程,这个睡眠时间对于任何一个线程都会略有不同。由于锁的工作方式,较快的线程是否会被较慢的线程阻塞,因为它必须等待它完成?
例如:
Thread1() {
lock();
usleep(10)
lock();
}
-
Thread2() {
lock();
sleep(100)
lock();
}
现在因为 Thread2 持有锁的时间更长,这将导致瓶颈。只是为了确定,这个系统应该在谁获得锁上来回发生,对吧?
应该是:
Thread1 gets lock
Thread1 releases lock
Thread2 gets lock
Thread2 releases lock
Thread1 gets lock
Thread1 releases lock
Thread2 gets lock
Thread2 releases lock
等等,对吧? Thread1 应该永远无法在它释放后立即获取锁,不是吗?
【问题讨论】:
-
锁锁?不锁解锁?
-
@GregorMcGregor 有没有办法防止这种情况发生?
-
不建议让线程在持有锁的情况下休眠,并且出于您的目的(线程同步)休眠是错误的媒介。也许你应该使用一个额外的事件。线程 1 将等待该事件,该事件将在释放锁后从线程 2 发布。
-
sb9 已经说过了,但我想再次补充一点,您应该尽可能短地使用锁!
-
这个问题和优先级倒置有什么关系?不涉及优先级。这只是互斥体(不存在)公平性的问题。另外,我怀疑这里使用睡眠只是为了模拟工作。
标签: c++ multithreading