C++多线程和互斥锁
1.c++多线程
为了实现高并发服务器性能,采用多线程的方式进行编码
#include<iostream>
#include<thread>
#include<vector>
#include<mutex>
std::mutex mtx;//加锁,互斥锁
void work(int i)
{
std::cout << "do something arg: " << i
<< "id:" <<std::this_thread::get_id
<< std::endl;
}
int main()
{
std::thread worker1(work,10);
worker1.join();//等待worker1结束后执行主线程
//worker1.detach();//worker1线程独立运行于主线程之外,detach()之后join()会崩溃
std::cout << "main thread"
<< "id:" << std::this_thread::get_id
<< std::endl;
system("pause");
return 0;
}
使用std::thread创建线程,使用.join()函数使得子线程,运行完成后,继续运行主线程;使用.detach()使得子线程独立于主线程之外运行;
当我们创建16个子线程运行时,发现
#include<iostream>
#include<thread>
#include<vector>
#include<mutex>
std::mutex mtx;//加锁,互斥锁
void work(int i)
{
//mtx.lock();
std::cout << "do something arg: " << i
<< "id:" <<std::this_thread::get_id
<< std::endl;
//mtx.unlock();
}
int main()
{
std::vector<std::thread> work_vec;
for (int i = 0; i < 10; i++)
{
work_vec.push_back(std::thread (work, i));
}
for (int i = 0; i < 10; i++)
{
work_vec[i].join();
}
std::cout << "main thread"
<< "id:" << std::this_thread::get_id
<< std::endl;
system("pause");
return 0;
}
运行后发现16个子线程在进行cout打印操作时,出现了乱码
2.为了防止出现数据不安全的情况出现,使用互斥锁进行加锁,保证每次的打印操作不会出现问题。
void work(int i)
{
mtx.lock();
std::cout << "do something arg: " << i
<< "id:" <<std::this_thread::get_id
<< std::endl;
mtx.unlock();
}
进行打印后,不会再出现乱码的情况。