c++ - 线程 C++ 中的瓶颈

标签 c++ multithreading

所以我只是想验证一下我的理解,希望大家能够消除误会。所以基本上我有两个线程,它们使用相同的锁并在它们持有锁时执行计算,但有趣的是,在锁内我会让线程休眠一小段时间。对于这两个线程,每个线程的休眠时间都略有不同。由于锁的工作方式,较快的线程是否会被较慢的线程瓶颈,因为它必须等待它完成?

例如:

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 should never be able to acquire the lock right after it releases it, can it?

,线程 1 可以在释放锁后立即重新获取锁,因为线程 2 仍可能挂起(由于调度程序而休眠)

此外,sleep 仅保证线程至少所需的 sleep 量,它可以而且通常会更多。

在实践中,你不会在计算一个值时持有锁,你会得到锁,得到计算所需的值,解锁,计算它,然后再次获得锁,检查计算的旧值是否是仍然有效/想要,然后存储/返回您的计算结果。 为此,发明了 std::future 和原子数据类型。

...this system should have a back and forth happens on who gets the lock, right?

大部分 大多数时候它会来回,但有时可能/将会有两个线程 1 的锁定/解锁周期。这取决于您的调度程序,任何执行和周期都可能会有所不同。

关于c++ - 线程 C++ 中的瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33666772/

相关文章:

c++ - 如何查找进程中单个线程的 CPU 使用率

c++ - Qt:使用一个连接从多个线程写入数据库

c++ - 未能看到复合/迭代器设计模式的真正值(value)

java - JNI中如何释放返回的对象?

c++ - 哪个先执行,RAII还是函数返回值

java - Android:DataOutputStream 上的 NullPointerException

c# - 如何让 bulletphysics/bulletsharps 的多线程工作?

c++ - 编译 GCC 时错误部分模板特化,但不是 MSVC

c++ - Qt父机制

c++ - 通过类中重载的 operator new 返回不同的类指针