首页 > 解决方案 > std::mutex 对象的范围是什么?

问题描述

这是示例代码:

#include <iostream>
#include <thread>
#include <mutex>

int value = 0;

void criticalSection(int changeValue)
{
    std::mutex mtx;
    std::unique_lock<std::mutex> uniqueLock(mtx);
    value = changeValue;
    std::cout << value << std::endl;
    uniqueLock.unlock();
    uniqueLock.lock();
    ++value;
    std::cout << value << std::endl;
}

int main(int argc, char **argv)
{
    std::thread t1(criticalSection, 1), t2(criticalSection, 2);
    t1.join();
    t2.join();

    return 0;
}

我的问题是:上面代码中 mtx 的范围是什么?每个线程会在该线程中创建一个 mtx 吗?如果我将 mtx 指定为全局变量而不是局部变量,有什么区别吗?

我刚开始学习 C++ 中的多线程。非常感谢您的帮助。

标签: c++multithreading

解决方案


互斥体没有特殊的范围规则。他们的范围在 next 结束}。在您的代码中,每次调用criticalSection都会创建一个新mutex实例。因此,互斥锁不可能用于同步两个线程。为此,两个线程都需要使用相同的互斥锁。

您可以将对互斥体的引用传递给函数:

#include <iostream>
#include <thread>
#include <mutex>

int value = 0;

void criticalSection(int changeValue,std::mutex& mtx)
{
    std::unique_lock<std::mutex> uniqueLock(mtx);
    //...
}

int main(int argc, char **argv)
{
    std::mutex mtx;
    std::thread t1(criticalSection, 1,std::ref(mtx)), t2(criticalSection, 2,std::ref(mtx));
    t1.join();
    t2.join();

    return 0;
}

或者,您可以使用 a并在唯一共享状态std::atomic<int> value;时删除互斥锁。value


推荐阅读