为什么我的两个线程之一从未获得互斥锁?

时间:2019-03-08 20:27:37

标签: c++ multithreading

我有两个线程,每个线程都有一个执行某些工作的循环。两者之间唯一真正的行为差异是线程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

0 个答案:

没有答案