C 11多執行緒基本使用

2021-08-19 06:37:12 字數 2956 閱讀 1967

#include

#include

#include

using

namespace

std;

//執行緒函式

void func(int a, int b, int c)

int main()

, 4,5,6);

t4.join();

//獲取cpu的核數

cout

<< "cpu: "

<< thread::hardware_concurrency() << endl;

//std::thread t3(func, 3, 4, 5);

return

0;}

detach可以將執行緒與執行緒物件分離,讓執行緒作為後台執行緒執行,當前執行緒也不會阻塞了.但是detach之後就無法在和執行緒發生聯絡了.如果執行緒執行函式使用了臨時變數可能會出現問,執行緒呼叫了detach在後台執行,臨時變數可能已經銷毀,那麼執行緒會訪問已經被銷毀的變數.join能保證.

雖然這種方式建立執行緒很方便,但是std::thread 出了作用域後將會析構,這個時候執行緒函式還沒執行完則會發生錯誤.

執行緒不可以複製但是可以移動.但是執行緒移動後,執行緒物件將不再代表任何執行緒了:

std::thread t(func);

//移動後,執行緒物件t不在代表任何執行緒

std::thread t1(std::move(t));

// t.join();

t1.join();

std::timed_mutex: 帶超時的獨佔互斥量,不能遞迴使用.

std::recursive_mutex: 遞迴互斥量,不帶超時功能.

std::recursive_timed_mutex: 帶超時的遞迴互斥量.

#include

#include

<

thread

>

#include

using namespace std;

std::mutex g_lock;

void func()

void f()

int main()

std::recursive_mutex遞迴鎖允許同乙個執行緒多次獲得互斥量.但是盡量不要使用遞迴鎖:

需要用到遞迴鎖定的多執行緒互斥處理往往本身就是可以簡化的,允許遞迴互很容易放縱複雜邏輯的產生,從而導致一些多執行緒同步引起的晦澀問題.

遞迴鎖比起非遞迴鎖,效率會低.

遞迴鎖雖然允許同乙個執行緒多次獲得同一互斥量,但是可重複獲得的最大次數並未具體說明,一旦超過一定次數就會丟擲異常.

帶超時的互斥量在獲取鎖的時候增加了超時等待功能,因為有時不知道獲取鎖需要多久,為了不至於一直等待獲取互斥量,就設定乙個等待超時時間,在超時後還可以做其他的的事情.

#include

#include

<

thread

>

#include

#include

using namespace std;

std::timed_mutex mutex1;

void work()

else

}}int main()

c++11提供了兩種條件變數

std::condition_variable,配合std::unique_lock進行wait操作

std::condition_variable_any,和任意帶有lock,unlock的mutex進行搭配使用,比較靈活但效率略低。

條件變數的使用過程如下:

擁有條件變數的執行緒獲取互斥鎖

迴圈檢查某個條件,如果條件不滿足,則阻塞直到條件滿足,如果條件滿足,則向下執行.

某個執行緒滿足條件執行完之後呼叫notify_one或notify_all喚醒乙個或者所有的等待執行緒.

//同步佇列的實現

#include

#include

#include

#include

#include

using

namespace

std;

template

class syncqueue

//判斷是否為空

bool isempty()

public:

syncqueue(int max):m_maxsize(max)

//相緩衝區新增資料

void put(const t& x)

//相緩衝區新增資料

m_queue.push_back(x);

//喚醒處於等待中的非空條件變數

m_notempty.notify_one();

}//從緩衝區獲取資料

void take(t& x)

);//若為空則需等待,而不能從緩衝區中取出

while(isempty())

//獲取資料

x = m_queue.front();

//刪除被獲取的資料

m_queue.pop_front();

m_notfull.notify_one();

}bool empty()

bool full()

size_t size()

};

#include

struct atomiccounter

void decrement()

intget()

};

#include

#include

#include

std:once_flag flag;

void do_once());}

int main()

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...