并发编程(二)互斥体解决线程同步问题

发布时间:2024年01月15日

如下一个线程同步程序:

#include <iostream>

#include <thread>

int g_Value = 0; 一个全局变量

void add()

{

??? for (size_t i = 0; i < 1000000; i++)

??? {

?????????g_Value++;

??? }

}

int main()

{

??? std::thread objA(add);

??? std::thread objB(add);

??? objA.join();

??? objB.join();

??? std::cout << g_Value << std::endl;

??? system("pause");

??? return 0;

}

程序运行,打印结果实际应该2000000但每次运行打印随机数,原因是丢失操作

解决方法一:互斥体

需要包含<mutex>库 std::mutex 互斥体类型

std::mutex some_mutex; 声明一个互斥体

此后原程序在哪会出错,就在哪加一个锁,如上述程序

void add()

{

??? for (size_t i = 0; i < 1000000; i++)

??? {

????????some_mutex.lock(); 加锁,当一个线程在访问该函数时,其他线程无法访问

?????? ?g_Value++; 保护

??????? some_mutex.unlocke(); 解锁

??? }

}

如上操作,多线程需要访问该函数时,保证每个时刻只有一个线程在访问

解决方式二:

void add()

{

??? for (size_t i = 0; i < 1000000; i++)

??? {

?????? //构造函数调用时枷锁,析构函数调用时解锁

?????? std::lock_guard<std::mutex> guard(some_mutex);类模板

?????? g_Value++;

??? }

}

文章来源:https://blog.csdn.net/2301_78838647/article/details/135604703
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。