当前位置: 首页 > article >正文

C++(11):通过变成模板实现线程安全调用api

有的时候我们在多线程中调用同一个api,但是api有可能不是线程安全的,这种情况会产生多线程的竞争:

#include <string>
#include <iostream>
#include <thread>
using namespace std;

int g_d = 0;
void doAdd(int num)
{
	for(int i = 0; i < num; ++i)
	{
		g_d++;
	}
}

void tFunc(int a)
{
	doAdd(a);
}

int main()
{
	thread t1(tFunc, 60000);
	thread t2(tFunc, 80000);
	t1.join();
	t2.join();
	cout<<g_d<<endl;
	return 0;
}

运行程序输出的结果每一次可能都不一样,因为多个线程同时对g_d的写入产生了竞争。

可以通过实现一个装饰器的方式,完成多线程中对同一个函数的线程安全调用。

//call_api_with_mutex.h
#ifndef CALL_API_WITH_MUTEX
#define CALL_API_WITH_MUTEX

#include <mutex>
#include <shared_mutex>
#include <unordered_map>
#include <memory>
#include <utility>
#include <iostream>

template<class Fn, class ...Args>
decltype(auto) callApiWithMutex(Fn&& fn, Ar

http://www.kler.cn/a/13879.html

相关文章:

  • diffusion扩散模型之hello world
  • 部署Hexo教程(以及博主成功踩的各种雷)
  • 如何正确选择集体渲染(云渲染)和gpu离线渲染
  • Android---屏幕适配
  • MySQL的内置函数
  • Linux新的设备或分区挂载到系统中mount使用方法
  • 540. 有序数组中的单一元素
  • 120名顶级技术专家用GPT-4搞出的脑洞发明大赏
  • ElasticSearch——详细看看ES集群的启动流程
  • 社区生态 | openEuler、龙蜥Anolis、统信UOS三大主流操作系统下编译GreatSQL二进制包
  • 基于单片机的家庭应急电源设计
  • ERROR [io.undertow.request] UT005023: Exception handling request 报错处理
  • Linux中的DNS域名解析配置及原理
  • 文章改写神器在线-AI续写文章生成器
  • 权限控制_SpringSecurity
  • Binder 驱动结构体列表
  • winForm常用控件
  • 别再重复造轮子了,一个 Spring 注解轻松搞定循环重试功能!
  • 免费且不丢失数据的MBR转GPT软件!
  • 实验架构的部署