C++并发编程:互斥锁std::mutex和lock_guard的使用

(1)std::mutex 是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。

mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。线程在访问共享资源之前首先需要锁住 std::mutex,然后在完成操作后释放锁。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。

(2)std::lock_guard 是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。使用 std::lock_guard 的好处是,当 std::lock_guard 对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。

多个线程修改共享数据时,可以这样写:

--------------------------------------------------------

std::mutex myMutex;

共享数据 data;

func(){

   std::lock_guardlock(myMutex);

  修改共享数据;

}

-----------------------------------------------

  • 模板参数,指定了 std::lock_guard 应该使用何种类型的锁。
  • lock(myMutex): 这是 std::lock_guard 的构造函数,它接受一个互斥锁作为参数,并在构造时锁定该互斥锁。

#include 
#include 
#include 

std::mutex myMutex;
int sharedData = 0;

void modifySharedData(int threadId) {
    // 使用锁保护共享数据
    std::lock_guard lock(myMutex);

    // 修改共享数据
    sharedData++;
    std::cout << "Thread " << threadId << " modified sharedData: " << sharedData << std::endl;
    // 离开作用域时,锁会自动释放
}

int main() {
    const int numThreads = 3;
    std::thread threads[numThreads];

    for (int i = 0; i < numThreads; ++i) {
        threads[i] = std::thread(modifySharedData, i + 1);
    }

    for (int i = 0; i < numThreads; ++i) {
        threads[i].join();
    }

    std::cout << "Final value of sharedData: " << sharedData << std::endl;

    return 0;
}

有三个线程同时修改一个共享的整数变量 sharedData。通过使用 std::mutex,我们确保了每个线程在修改 sharedData 时都先获取了锁,从而避免了竞争条件。

你可能感兴趣的:(c++,c++,开发语言)