互斥锁定和解锁时差

时间:2016-12-21 07:44:20

标签: c++ multithreading

我是多线程编程的新手。我有一个简单的测试程序:

#include <mutex>
#include <thread>
#include <iostream>
int main(){
    std::mutex mtx;
    std::thread t1([&](){
        while (true){
            mtx.lock();
            std::cout << 1 << "Hello" << "\n";
            mtx.unlock();
        }
    });
    std::thread t2([&](){
        while (true){
            mtx.lock();
            std::cout << 2 << "Hello" << "\n";
            mtx.unlock();
        }
    });
    t1.join();
    t2.join();
}

这是一个非常简单的程序,它打印&#34; 1Hello&#34;和&#34; 2你好&#34;以随机模式,这意味着互斥锁由一个解锁,然后由另一个获取并以某种随机模式执行。

它是否在标准中指定了行为,也就是说,实现是否会保证它不会坚持t1?如果没有,我该如何避免呢?

1 个答案:

答案 0 :(得分:3)

不应该保证谁会跑步。如果您可以将一个线程的优先级设置为高于另一个线程,则可以使用此代码保证只有最高优先级的线程将运行。

实际问题是什么?问题是这段代码以最糟糕的方式使用多线程。这是一项非常成就,并不是很糟糕,因为这是一项练习。它要求线程连续运行,它在执行长动作时锁定,并且仅解锁下一个循环,因此实际上没有并行性,只有互斥锁的争夺。

如何解决这个问题?让线程执行一些后台操作然后停止或让线程等待一个条件至少让线程暂时休眠并让线程尽可能独立运行,而不是阻止其他线程执行长期操作。 / p>

编辑(小澄清):虽然这段代码以最糟糕的方式使用多线程,但它是如何做到的一个很好的干净的例子。

相关问题