【C++多线程编程】(七)之 详解互斥量mutex、上锁lock、解锁unlock

发布时间:2023年12月23日

互斥量(mutex)是一种用于实现线程同步的机制,用于保护共享资源免受并发访问的机制,以防止多个线程同时访问或修改相同的数据而引发竞态条件(Race Condition)。

在多线程环境中,多个线程可能同时访问共享的数据,如果没有适当的同步机制,就会导致数据不一致或产生其他问题。互斥量通过提供对共享资源的互斥访问,确保一次只有一个线程可以执行关键代码段,从而防止冲突。

基本的互斥量操作包括两个主要动作:上锁(Lock)和解锁(Unlock)。当一个线程获得互斥量的锁时,其他线程尝试获取锁将会被阻塞,直到持有锁的线程解锁。这确保了在任意时刻只有一个线程能够执行受保护的代码段。

mutex

互斥量是一种同步原语,它提供了一种机制,确保在同一时刻只有一个线程能够访问共享资源。在C++中,互斥量通常通过std::mutex类来表示。

std::mutex myMutex; // 创建一个互斥量对象

lock( )

上锁是指在访问共享资源之前,通过互斥量锁住资源,确保只有一个线程能够进入临界区,从而防止其他线程同时访问相同的资源。在C++中,可以使用std::lock_guardstd::unique_lock来实现上锁操作。

#include <mutex>

std::mutex myMutex;

void someFunction()
{
    std::lock_guard<std::mutex> lock(myMutex); // 使用lock_guard进行上锁

    // 在这里进行对共享资源的访问或修改
    // ...

} // lock_guard 在这里离开作用域,自动释放锁

或者使用 std::unique_lock

#include <mutex>

std::mutex myMutex;

void someFunction()
{
    std::unique_lock<std::mutex> lock(myMutex); // 使用unique_lock进行上锁

    // 在这里进行对共享资源的访问或修改
    // ...

} // unique_lock 在这里离开作用域,自动释放锁

unlock( )

解锁是指在访问共享资源后释放互斥量,使其他线程能够获得对共享资源的访问权限。在C++中,使用 std::lock_guardstd::unique_lock 在其作用域结束时会自动释放锁,无需手动调用解锁操作。

以下案例std::unique_lock首先被锁定,然后通过unlock手动解锁,执行一些不需要互斥量保护的代码,最后通过lock重新锁定互斥量,以确保在需要时对共享资源进行保护。这种手动解锁的情况在某些复杂的同步场景中可能会有用,但一般情况下,使用自动解锁的 std::lock_guard 更为简便和安全。

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

std::mutex myMutex;

void someFunction()
{
    std::unique_lock<std::mutex> lock(myMutex); // 上锁

    // 在这里进行对共享资源的访问或修改
    std::cout << "Thread ID: " << std::this_thread::get_id() << " is working." << std::endl;

    // 在一些条件下,我们可能希望提前解锁互斥量,然后重新锁定
    lock.unlock(); // 手动解锁

    // 这里是一些不需要互斥量保护的代码
    // ...

    // 然后可能需要再次锁定互斥量
    lock.lock(); // 重新锁定

    // 在这里继续进行对共享资源的访问或修改
    std::cout << "Thread ID: " << std::this_thread::get_id() << " is working again." << std::endl;

} // lock 在这里离开作用域,自动释放锁

int main()
{
    std::thread t1(someFunction);
    std::thread t2(someFunction);

    t1.join();
    t2.join();

    return 0;
}

文章来源:https://blog.csdn.net/qq_54199287/article/details/135159134
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。