静音锁定和解锁时间差

Mutex locking and unlocking time difference

本文关键字:解锁 时间差 锁定      更新时间:2023-10-16

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

#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();
}

这是一个非常简单的程序,它以随机的模式打印" 1hello"answers" 2hello",这意味着mutex被一个人解锁,然后由另一个然后以某种随机模式获得并执行。

是否在标准中指定的行为,也就是说,实施是否可以保证它不遵守T1?如果没有,我该如何避免它?

不应保证谁将运行。如果您可以将一个线程的优先级设置高于另一个线程的优先级,则可以保证只有最高优先级线程即可运行。

实际问题是什么?问题在于,此代码以最坏的方式使用多线程。这是一项成就,而且还不错,因为这是一种练习。它要求线程连续运行,在执行长时间操作时锁定并仅为下一个循环解锁,因此实际上没有并行性,只有一场静音的战斗。

如何解决?让螺纹执行一些背景操作,然后停止或让线程等待条件至少让线程偶尔睡觉,并让线程尽可能独立,而不是阻止其他人在可能执行长时间的动作时阻止其他人。<<<<<<<</p>


编辑(小澄清):虽然此代码以最坏的方式使用多线程,但这是一个很好的示例。