#include <iostream>
#include <mutex>
#include <thread>
#include <vector>
/*
* @desc std::mutex
* @constructor
* constexpr mutex() noexcept; // 只有一个默认构造函数
* mutex (const mutex&) = delete; // 禁止拷贝构造
* @function
* mutext互斥量,为线程提供基本的互斥和同步工具,有效的保护多线程之间共享数据的数据安全。
* @method
* 1、mutext.lock():获取mutext锁,针对不同的场景会出现下面三种情况
* (1) 若该互斥量没有被锁住,则调用线程将该互斥量锁住,直到调用unlock之前,该线程一直拥有锁。
* (2) 若该互斥量被其他线程锁住,则当前的调用线程被阻塞
* (3) 若该互斥量被当前线程锁住,则产生死锁(deallock)
* 2、mutext.try_lock():尝试获取mutex锁,针对不同场景会出现下面三种情况
* (1) 该互斥量没有被锁住,则调用线程将该互斥量锁住,直到调用unlock之前,该线程一直拥有锁。【与lock相同】
* (2) 该互斥量被其他线程锁住,尝试lock失败,返回false,不阻塞【与lock有区别】
* (3) 高互斥量被当前线程锁住,则产生死锁(deallock)
* 3、mutext.unlock():对mutex进行解锁,释放当前线程对mutex的所有权。
* @other
* std::recursive_mutex
* 支持递归的互斥量对象,允许同一个线程内对mutex进行多次上锁(即递归上锁),来获得互斥量对象的
* 多层所有权。注意:lock和unlock的调用必须一一对应,即调用次数相同。
*/
std::mutex g_mtx;
int count;
void ThreadWork() {
// 若当前mutex被其他线程锁住,则lock()阻塞
// g_mtx.lock();
// 若被锁住,则try_lock()不阻塞返回false
while (!g_mtx.try_lock()) continue;
for (int i = 0; i < 10000; i++)
count++;
g_mtx.unlock();
}
int main() {
std::vector<std::thread> threadVec;
for (int i = 0; i < 10; i++) {
threadVec.emplace_back(ThreadWork);
}
for (auto& th : threadVec) {
th.join();
}
std::cout << count << std::endl;
}
以示例方式记录mutex
最新推荐文章于 2024-07-28 21:43:19 发布
本文详细介绍了C++11中mutex的使用方法,通过实例代码展示如何在多线程环境下保证数据同步和互斥访问,确保程序的正确运行。
摘要由CSDN通过智能技术生成