我有两个线程,每个线程都有一个执行某些工作的循环。两者之间唯一真正的行为差异是线程1在将其互斥锁锁定在循环之前执行了sleep_for
,而线程2则没有。目标是使系统上的线程1保持点亮:我不希望它重击CPU 100%。线程2本质上是临时的,因此它在工作时不应休眠。但是线程2的工作量(每次迭代)很繁琐(因此,在我的示例中,在锁之后的示例中,sleep_for
在 之后,由于实际工作而模拟了长期持有的锁)。< / p>
线程2获取所有执行时间。实际上,线程1在4秒后仅获得1次迭代。我期望线程1锁定std::mutex
,等待解锁,然后它获取锁定。 std::mutex
是否不充当排序队列?意思是,即使线程2在获取锁之前没有处于休眠状态,但当它尝试在下一个迭代中锁定时,由于线程1是下一个要获取该锁的线程,它还是不得不等待释放该锁?即使在那里睡觉,我也希望每个线程1和线程2都可以转弯。
我在哪里错了?这种行为的解释是什么? C ++标准提供的保证是什么?不是?
#include <thread>
#include <atomic>
#include <mutex>
#include <iostream>
#include <chrono>
using namespace std::chrono_literals;
std::unique_lock<std::mutex> LockMutex()
{
static std::mutex m;
return std::unique_lock<std::mutex>{m};
}
int main()
{
std::atomic_bool running{true};
std::thread t1{[&] {
while (running)
{
std::this_thread::sleep_for(100ms);
auto lock = LockMutex();
std::cout << "Thread 1 :: Time Slice\n";
}
}};
std::thread t2{[&] {
while (running)
{
auto lock = LockMutex();
std::cout << "Thread 2 :: Time Slice\n";
std::this_thread::sleep_for(100ms);
}
}};
std::this_thread::sleep_for(4s);
running = false;
t1.join();
t2.join();
}
我得到的输出是:
Start
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 2 :: Time Slice
Thread 1 :: Time Slice
0
Finish
用于测试的实时代码示例here。