多线程编程C++++++++++第6课(互斥访问模拟初始化工作)

文章介绍了如何利用C++的std::once_flag和std::call_once功能,配合mutex,确保初始化函数SystemInit在多线程环境中只执行一次,避免了重复初始化的问题。在main函数中创建的三个线程尝试调用mutex_SystemInit,但初始化只会执行一次。
摘要由CSDN通过智能技术生成

有时候,模拟化工作只需要做一次,假设SystemInit()是一个初始化程序块,我们在整个程序中只运行执行一次,即使多个线程使用该SystemInit()进行多次初始化也不行。使用mutex对该块函数进行上锁。#include , 编写完 SystemInit(),再编写一个只执行一次的函数 mutex_SystemInit(){
static std::once_flag flag;
std::once_call(flag,SystemInit);
};

/*
在初始化函数的调用中,防止初始化被多次调用,加个限定只允许初始化一次
*/
#include <iostream>
#include <mutex>
#include <thread>
#include <Windows.h>
using namespace std;

void SystemInit() {
	cout << "System Init!!" << endl;
};

void mutex_SystemInit() {
	static std::once_flag flag;
	std::call_once(flag, SystemInit);
	std::cout << this_thread::get_id() << endl;
}

int main() {

	mutex_SystemInit();
	//三个线程池
	for (int i = 0; i < 3; i++) {
		thread th(mutex_SystemInit);
		th.detach();
	}
	Sleep(3000);

	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值