什么是互斥锁?怎么运用互斥锁?

1、什么是互斥锁?

互斥锁是(Mutex)是一种用于多线程编程的同步原语,用于确保在多个线程访问共享资源时的互斥性

在多线程环境中,当多个线程同时访问共享资源时,可能会导致数据的竞争和不一致问题。为了避免这种问题,需要确保在任何时候只有一个线程能够访问共享资源,而其他线程需要等待直到资源可用

互斥锁提供这样一种机制,即在某个线程访问共享资源时,它会有互斥锁,其他线程需要等待互斥锁的释放才能访问共享资源。一旦线程完成对共享资源的访问,它会释放互斥锁,以便其他线程可以获取互斥锁并访问共享资源。

2、互斥锁的基本操作包括两个重要的步骤:加锁和解锁

加锁(Lock):当一个线程需要访问共享资源时,它会尝试获取互斥锁。如果互斥锁当前没有被其他线程持有,那么该线程就能够获取互斥锁,继续执行访问共享资源的代码。如果互斥锁已经被其他线程持有,那么该线程会进入堵塞状态,等待互斥锁的释放。

解锁(Unlock):当一个线程完成对共享资源的访问时,它会释放互斥锁,以便其他线程可以获取互斥锁并访问共享资源。

3、示例代码

main.cpp

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

std::mutex mtx;
int sharedResource = 0;

void increment()
{
    for (int i=0; i<5; ++i){
        std::lock_guard<std::mutex> lock(mtx); // 使用 std::lock_guard 创建互斥锁的作用域,确保每次只有一个线程可以访问 sharedResource
        sharedResource++;
        std::cout << "Increatmented, value: " << sharedResource << std::endl;
    } // 在作用域结束时,std::lock_guard 会自动释放互斥锁
}

void decrement()
{
    for (int i=0; i< 5; ++i){
        std::lock_guard<std::mutex> lock(mtx);
        sharedResource--;
        std::cout << "Decremented, value: " << sharedResource << std::endl;
    }
}

int main()
{
    // 创建了两个线程 t1 和 t2
    std::thread t1(increment);
    std::thread t2(decrement);
    
    // 等待这两个线程的执行结束
    t1.join();
    t2.join();

    std::cout << "Final shared resource value: " << sharedResource << std::endl;

    return 0;
}

CmakeList.txt

cmake_minimum_required(VERSION 3.5)

project(untitled2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Threads REQUIRED)
add_executable(untitled2 main.cpp)

#include(GNUInstallDirs)
#install(TARGETS untitled2
#    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
#    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
#)



target_link_libraries(untitled2 Threads::Threads)

程序输出

23:12:22: Starting /home/lrj/build-untitled2-Desktop_Qt_5_15_2_GCC_64bit-Debug/untitled2...
Increatmented, value: 1
Increatmented, value: 2
Increatmented, value: 3
Increatmented, value: 4
Increatmented, value: 5
Decremented, value: 4
Decremented, value: 3
Decremented, value: 2
Decremented, value: 1
Decremented, value: 0
Final shared resource value: 0
23:12:22: /home/lrj/build-untitled2-Desktop_Qt_5_15_2_GCC_64bit-Debug/untitled2 退出,退出代码: 0

由输出信息可见,increament对共享资源访问的时候,decrement是堵塞的。

猜你喜欢

转载自blog.csdn.net/weixin_45824067/article/details/132067750