1. 程式人生 > >c++11多執行緒的建立和unique_lock的使用

c++11多執行緒的建立和unique_lock的使用

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。