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 创建互斥锁的作用域,确保每次只有一个线程可以访问 sharedResourcesharedResource++;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 和 t2std::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是堵塞的。