多線程
初級概念與傳參
#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); //根據(jù)函數(shù)初始化 并執(zhí)行
//thread t2(run);
//thread t3(run);
thread t[5]{thread(run),thread(run) ,thread(run) ,thread(run), thread(run) }; //初始化
//堆上開辟線程數(shù)組
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(); //主線程等待當(dāng)前線程結(jié)束后再退出
//}
auto n = thread::hardware_concurrency(); //獲取CPU核心個數(shù)
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; //互斥 加鎖解鎖浪費(fèi)時間
atomic_int num{ 0 }; //原子變量 不會發(fā)生線程沖突 線程安全
void run1()
{
for (size_t i = 0; i < 10000000; i++)
{
m.lock();
num++;
m.unlock();
}
}
//全局變量 沖突 結(jié)果不正確 速度快
//mutex 加鎖 結(jié)果正確 速度慢
//atmoic 結(jié)果正確 速度比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表達(dá)式 與 多線程
#include<chrono>
void mainxx4()
{
auto fun = []() {MessageBoxA(0, "SSSS", "RRRR", 0);};
thread th3([]() {
cout << this_thread::get_id() << " " << std::endl,//獲取當(dāng)前線程ID
this_thread::yield(); //讓CPU先執(zhí)行其他線程 空閑
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();
}