多线程
初级概念与传参
#include<thread>
#include<Windows.h>
using namespace std;
void run()
{
MessageBoxA(0,"SSSS","RRRR",0);
}
void showmsg(const char*str1,const char*str2)
{
MessageBoxA(0, str1, str2, 0);
}
void mainxx1()
{
//同步 阻塞
//run();
//run();
//run();
//并行 异步 非阻塞
//thread t1(run); //根据函数初始化 并执行
//thread t2(run);
//thread t3(run);
thread t[5]{thread(run),thread(run) ,thread(run) ,thread(run), thread(run) }; //初始化
//堆上开辟线程数组
thread *pthread(new thread[5]{ thread(run),thread(run) ,thread(run) ,thread(run), thread(run) });
thread t2(showmsg,"sss","ddddd"); //多线程传参
cin.get();
}
join deatch
#include<array>
void show()
{
MessageBoxA(0, "SSSS", "RRRR", 0);
}
void mainxx2()
{
//array<thread, 3>threads{thread(show), thread(show), thread(show)};
//for (size_t i = 0; i < 3; i++)
//{
// threads[i].join(); //主线程等待当前线程结束后再退出
//}
auto n = thread::hardware_concurrency(); //获取CPU核心个数
cout << n << endl;
thread th(run);
th.detach(); //脱离主线程绑定 主线程挂了 不影响子线程退出出错
//detach以后 线程无法通信 无法join
cout << th.joinable() << endl; //判断是否可以加入等待
cin.get();
}
原子变量 互斥锁 与 线程安全
线程安全 多线程访问冲突 冲突不安全
#include<mutex>
#include<atomic>
//int num = 0;
mutex m; //互斥 加锁解锁浪费时间
atomic_int num{ 0 }; //原子变量 不会发生线程冲突 线程安全
void run1()
{
for (size_t i = 0; i < 10000000; i++)
{
m.lock();
num++;
m.unlock();
}
}
//全局变量 冲突 结果不正确 速度快
//mutex 加锁 结果正确 速度慢
//atmoic 结果正确 速度比mutex快
void mainxx3()
{
clock_t start = clock();
thread th1(run);
thread th2(run);
th1.join();
th2.join();
clock_t end = clock();
cout << end - start <<"ms"<< endl;
cin.get();
}
lambda表达式 与 多线程
#include<chrono>
void mainxx4()
{
auto fun = []() {MessageBoxA(0, "SSSS", "RRRR", 0);};
thread th3([]() {
cout << this_thread::get_id() << " " << std::endl,//获取当前线程ID
this_thread::yield(); //让CPU先执行其他线程 空闲
this_thread::sleep_for(chrono::seconds(3)); //等待3秒
//this_thread::sleep_until(); //在某个时刻到来之前一直等待
});
thread th4([]() {
cout << this_thread::get_id() << endl;
});
thread th1([]() { MessageBoxA(0, "SSSS", "RRRR", 0); });
thread th2(fun);
cin.get();
}









网友评论