所以我只是想验证一下我的理解,希望你们能够消除任何误解。所以本质上我有两个线程使用相同的锁并在持有锁时执行计算,但有趣的是,在锁内我将导致线程休眠一小段时间。对于两个线程,每个线程的睡眠时间都会略有不同。由于锁的工作方式,较快的线程是否会因较慢的线程而成为瓶颈,因为它必须等待它完成?
例如:
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 应该永远无法在释放锁后立即获取锁,不是吗?
Thread1 应该永远无法在释放锁后立即获取锁,不是吗?
No, 线程1could在释放锁后立即重新获取锁,因为 Thread2 仍然可以暂停(由于调度程序而休眠)
Also sleep
只保证线程会休眠at least想要的金额,它可以而且通常会更多。
实际上,您在计算值时不会持有锁,您将获得锁,获得计算所需的值,解锁,计算它,然后再次获得锁,检查计算的旧值是否仍然有效/想要的,然后存储/返回您的计算结果。
为此,std::future
并发明了原子数据类型。
...这个系统应该有一个来回发生的事情来决定谁获得锁,对吗?
Mostly大多数情况下,这将是一个来回的过程,但有时线程 1 可能/将会有两个锁定/解锁周期。这取决于您的调度程序,任何执行和周期都可能会有所不同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)