feat: ExThreadSafety
This commit is contained in:
parent
54b2ef6034
commit
33393cb858
53
ExThreadSafety/multithread.h
Normal file
53
ExThreadSafety/multithread.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*******************************************************************
|
||||||
|
* Copyright (C) 2022 偕臧 All rights reserved.
|
||||||
|
*
|
||||||
|
* Author: 偕臧 <xmulitech@gmail.com>
|
||||||
|
* GitHub: https://github.com/xmuli
|
||||||
|
* Blog: https://ifmet.cn
|
||||||
|
*
|
||||||
|
* Create: 2022.01.12
|
||||||
|
* Modify: 2022.01.14
|
||||||
|
* File: multithread.h
|
||||||
|
* Description: 一个多线程竞争的例子,分析出现的“非线程安全”的具体原因,以及两个
|
||||||
|
* 解决方法:atomic 和 mutex
|
||||||
|
*
|
||||||
|
******************************************************************/
|
||||||
|
#ifndef MULTITHREAD_H
|
||||||
|
#define MULTITHREAD_H
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <mutex>
|
||||||
|
#include <thread>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// 方案一:定义为原子变量 atomic
|
||||||
|
//atomic<int> g_num = 0;
|
||||||
|
|
||||||
|
// 方案二:加锁 mutex
|
||||||
|
int g_num = 0;
|
||||||
|
mutex g_mutex;
|
||||||
|
|
||||||
|
void addition()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 5000; ++i) {
|
||||||
|
g_mutex.lock(); // 尝试和下一行的 cout 行互换位置
|
||||||
|
cout << "threadId:" << this_thread::get_id() << " g_num:" << g_num << endl;
|
||||||
|
g_num++;
|
||||||
|
g_mutex.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
使用示例
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
thread th1(addition);
|
||||||
|
thread th2(addition);
|
||||||
|
th1.join();
|
||||||
|
th2.join();
|
||||||
|
|
||||||
|
cout << "g_num:" << g_num << endl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user