c++11多執行緒的建立和unique_lock的使用
阿新 • • 發佈:2019-02-05
1.多執行緒的建立
(1)在cmakelist中加入編譯選項c11和多執行緒
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -pthread -g -march=native")
-g 表示debug
(2)包括標頭檔案
#include<thread>
(3)新建執行緒
新建執行緒兩個
使用thread 執行緒名來新建一個執行緒
並在執行緒中threadHello呼叫函式 void sayHello()
並在執行緒中threadWorld呼叫函式 void sayWorld()
#include <iostream>
#include<thread>
#include<unistd.h>
using namespace std;
void sayHello()
{
while(1)
{
sleep(1);
cout<<endl<<"hello"<<endl;
}
}
void sayWorld()
{
while(1)
{
sleep(1);
cout<<endl<<"world"<<endl;
}
}
int main()
{
thread threadHello(&sayHello);
thread threadWorld(&sayWorld);
threadHello.join();
threadWorld.join();
return 0;
}
2.執行緒的同步(unique_lock的使用)
unique_lock中的unique表示獨佔所有權。
unique_lock獨佔的是mutex物件,就是對mutex鎖的獨佔。
用法:
(1)新建一個unique_lock 物件
(2)給物件傳入一個std::mutex 物件作為引數;
std::mutex mymutex;
unique_lock lock(mymutex);
因此加鎖時新建一個物件lock
unique_lock lock(mymutex);
而這個物件生命週期結束後自動解鎖。
如下例子
#include <iostream>
#include<thread>
#include<unistd.h>
#include<mutex>
using namespace std;
std::mutex mymutex;
void sayHello()
{
int k=0;
unique_lock<mutex> lock(mymutex);
while(k<2)
{
k++;
cout<<endl<<"hello"<<endl;
sleep(2);
}
}
void sayWorld()
{
unique_lock<mutex> lock(mymutex);
while(1)
{
cout<<endl<<"world"<<endl;
sleep(1);
}
}
int main()
{
thread threadHello(&sayHello);
thread threadWorld(&sayWorld);
threadHello.join();
threadWorld.join();
return 0;
}
程式執行步驟是這樣的:
首先同事執行threadHello執行緒和threadWorld執行緒
先進入threadHello執行緒的sayHello()函式,這個時候加了mymutex鎖,另外一個threadWorld執行緒進入後發現mymutex鎖沒有釋放,只能等待。
當過去兩個迴圈(每個迴圈2秒後)threadHello執行緒結束,unique_lock lock(mymutex)的生命週期結束,mymutex鎖釋放,執行threadWorld執行緒,此時開始一直say world。