53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
|
/*******************************************************************
|
|||
|
* 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
|