C++使用多线程必须包含头文件 #include <thread>
来实现
当多个线程同事访问一个对象的时候,会产生数据竞争现象。
这个时候,就可以加锁,同步资源,解决数据竞争。
最简单就是互斥锁mutex
上代码,计算一个数自增到1000:
#include <iostream>
#include <vector>
#include <thread>
#include <mutex>
using namespace std;
std::mutex g_mutex;
//线程函数
void Func(int& value, int idx)
{
while (true)
{
//加锁
std::lock_guard<mutex> lock(g_mutex);
//计算写数据
value++;
if (value > 1000)
{
cout << "Thread No." << idx << "\t Thread id: " << std::this_thread::get_id() << "\t exit" << endl;
break;
}
cout << "Thread No." << idx << "\t Thread id: " << std::this_thread::get_id() << ", value: " << value << endl;
//线程等待5ms
std::this_thread::sleep_for(std::chrono::milliseconds(5));
}
}
int main()
{
//核心数
int nCount = thread::hardware_concurrency();
auto t1 = std::chrono::steady_clock::now();
int value = 1;
vector<thread> arr;
for (int i = 0; i < nCount; i++)
{
arr.push_back(thread(Func, std::ref(value), i + 1));
}
//主线程等待子线程结束
for (int i = 0; i < nCount; i++)
{
arr[i].join();
}
auto t2 = std::chrono::steady_clock::now();
int64_t ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count();
std::cout << "time elapsed: " << ms << " ms" << std::endl;
cin.get();
return 0;
}
计算完毕,线程退出: