c++ thread mutex

复制代码
#include <iostream>       // std::cout
#include <thread>         // std::thread
#include <mutex>          // std::mutex

volatile int counter(0); // non-atomic counter
std::mutex mtx;           // locks access to counter

void increases_10k()
{
    for (int i=0; i<10000; ++i) {
        // 1. 使用try_lock的情况
        // if (mtx.try_lock()) {   // only increase if currently not locked:
        //     ++counter;
        //     mtx.unlock();
        // }
        // 2. 使用lock的情况
               {
                   mtx.lock();
                   ++counter;
                   mtx.unlock();
               }
    }
}

int main()
{
    std::thread threads[10];
    for (int i=0; i<10; ++i)
        threads[i] = std::thread(increases_10k);

    for (auto& th : threads) th.join();
    std::cout << " successful increases of the counter "  << counter << std::endl;

    return 0;
}

std::lock_guard 是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。使用 std::lock_guard 的好处是,当 std::lock_guard 对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。

复制代码
#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
volatile int sharedData(0);

void threadModifySharedData(int threadId){
    
    //1.
    std::cout << "threadId:" << threadId << std::endl;

    //2.add loack
    std::lock_guard<std::mutex> lock(mtx);

    //3.
    std::cout << "thread sharedData:" << sharedData << std::endl;

    //4.modif sharedData
    sharedData++;

}


int main(void){

    const size_t numThread = 10;
    std::thread threads[numThread];

    for(size_t i = 0; i < numThread; i++)
        threads[i] = std::thread(threadModifySharedData, i+1);

    for(size_t i = 0; i < numThread; i++)
        threads[i].join();

    std::cout << "main sharedData:" << sharedData << std::endl;

    return 0;
}

std::recursive_mutex:递归互斥锁,允许同一个线程多次锁定

复制代码
#include <iostream>
#include <mutex>
#include <thread>

struct Complx{
    int i;
    std::recursive_mutex mtx;

    Complx(int ii= 10):i(ii){
        std::cout << "Complx(int ii):i(ii)" << std::endl;
    }

    ~Complx(void){
        std::cout << "~Complx(void)" << std::endl;
    }

    void mul(int x){
        std::lock_guard<std::recursive_mutex> lock(mtx);
        i *= x;
    }

    void div(int x){
        std::lock_guard<std::recursive_mutex> lock(mtx);
        i += x;
    }

    void both(int x, int y){
        std::lock_guard<std::recursive_mutex> lock(mtx);
        mul(x);
        div(y);
    }
};

int main(void){
    Complx cpx(200);

    cpx.both(100,200);

    std::cout << "i:" << cpx.i << std::endl;

    return 0;
}
相关推荐
小雨下雨的雨1 小时前
井字棋AI机器人实现详解 - Minimax算法实战-鸿蒙PC Electron框架完成
前端·人工智能·算法·华为·electron·鸿蒙
xieliyu.3 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
一条小锦吕*4 小时前
基于Spring Boot + 数据可视化 + 协同过滤算法的推荐系统设计与实现(源码+论文+部署全讲解)
spring boot·算法·信息可视化
CryptoPP4 小时前
快速对接东京证券交易所API数据:实战指南与代码示例
开发语言·人工智能·windows·python·信息可视化·区块链
ZC跨境爬虫4 小时前
跟着 MDN 学JavaScript day_7:数学运算与逻辑判断实战测试
开发语言·前端·javascript·学习·ecmascript
如竟没有火炬5 小时前
最大矩阵——单调栈
数据结构·python·线性代数·算法·leetcode·矩阵
阳区欠6 小时前
【LangChain】LLM基础介绍
开发语言·python·langchain
Jinkxs6 小时前
Java 跨域14-Java 与区块链(Hyperledger)集成
java·开发语言·区块链
8Qi86 小时前
LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
算法·leetcode·职场和发展·动态规划
绿算技术6 小时前
万卡推理集群存储选型分析:从核心架构到应用视角
大数据·科技·算法·架构