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