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

什么是互斥锁?怎么运用互斥锁?1 什么是互斥锁 互斥锁是 Mutex 是一种用于多线程编程 的同步原语 用于确保在多个线程访问共享资源时的互斥性 在多线程环境中 当多个线程同时访问共享资源时 可能会导致数据的竞争和不一致问题 为了避免这种问题 需要确保在任何时候只有一个线程能够访问共享资源

大家好,我是讯享网,很高兴认识大家。

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是堵塞的。

小讯
上一篇 2025-02-17 11:57
下一篇 2025-02-18 09:18

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/121774.html