參考《深入應用c++11》
可以使用thread t(f(), args)建立執行緒,引數為執行緒函式,後面可以帶任意個需要傳入執行緒函式的引數#includeusing namespace std;
void func()
int main()
join方法可以使主線程阻塞住,直到t執行緒函式執行完,join方法不能獲取執行緒函式返回值
如果不希望主線程阻塞,而是讓t執行緒在後台執行,可以使用detach方法
int main()
(1)獲取當前資訊
(2)執行緒休眠thread t(func);
cout << t.get_id() << endl; //獲取當前執行緒id
cout << thread::hardware_concurrency() << endl; //獲取cpu核數,失敗返回0
互斥量是一種執行緒同步手段,用來保護多執行緒同時訪問的共享資料#includevoid f()
//執行緒休眠3秒後列印time_out
int main()
使用lock_guard可以簡化lock/unlock寫法,同時也更安全,因為lock_guard在構造時自動鎖定互斥量,在退出作用域時自動解鎖,避免了忘記unlock,因此應盡量使用lock_guard#includeusing namespace std;
mutex g_lock; //定義互斥量
g_lock.lock(); //鎖定互斥量
g_lock.unlock(); //解除對互斥量的占用
g_lock.try_lock(); //嘗試鎖定互斥量,成功返回true,失敗返回false,它是非阻塞的
std::lock_guardlocker(g_lock);
使用unique_lock也可以實現lock_guard的功能,但是更加靈活,具體參見c++多執行緒:條件變數、unique_lock
乙個執行緒多次獲取同乙個互斥量時會發生死鎖
遞迴互斥量允許同一執行緒多次獲得該互斥鎖,可以用來解決同一執行緒需要多次獲取互斥量的問題mutex g_lock;
void child_fun(int x)
void fun(int x)
int main()
帶超時的互斥量在獲取鎖時增加了超時等待功能,如果超時沒有獲取到可以做其他事情recursive_mutex g_lock;
void child_fun(int x)
void fun(int x)
int main()
可以用try_lock_for和try_lock_until方法設定超時時間,失敗返回0
條件變數是另一種用於等待的同步機制,能阻塞乙個或多個執行緒,直到收到另乙個執行緒發出的通知或超時chrono::milliseconds timeout(100);
if(mutex.try_lock_for(timeout))
cout << "success" << endl;//100毫秒內成功鎖定互斥量
c++11提供兩種條件變數
條件變臉一般和互斥量一起使用,具體例項可見同步阻塞佇列condition_varible //配合unique_lock進行wait操作
condition_varible_any //和任意帶有lock,unlock語義的mutex搭配使用,更靈活,但效率低於condition_varible
使用互斥量實現計數器
使用原子變數就不需要使用互斥量來保護變數了#includeusing namespace std;
class counter
void counter::decr()
int counter::get()
private:
int value;
mutex lock;
};
為了保證多執行緒環境中僅被呼叫一次,可以使用call_once,需要使用std::once_flag作為call_once的入參#includeusing namespace std;
class atomiccounter
void atomiccounter::decr()
int atomiccounter::get()
private:
atomicvalue;
};
c++提供了非同步操作的類,future類可以用來獲取執行緒函式的返回值once_flag flag;
void fun());}
int main()
//into fun只會列印一次
可以通過查詢future的狀態獲取非同步操作的結果,future_status有以下三種狀態
獲取future結果有三種方式deferred //非同步操作還沒開始
ready //非同步操作已經完成
timeout //非同步操作超時
非同步操作函式async可以直接建立非同步的task,非同步返回的結果也儲存在future中get() //等待非同步操作結束並返回結果
wait() //等待非同步操作完成,沒有返回值
wait_for() //超時等待返回結果
基本用法async(std::launch::async | std::launch::deferred, f, args)
//第乙個引數是執行緒的建立策略,launch::async是立即建立,launch::deferred是延遲建立,在呼叫get或wait時建立
結果為88#include int main()
); cout << f1.get() << endl;
futuref2 = async(launch::async, () );
f2.wait();
futurefuture = async(launch::async, () );
cout << "waiting" << endl;
auto status = future.wait_for(chrono::seconds(1));
do while (status != future_status::ready);
cout << "result is " << future.get() << endl;
return 0;
}
waiting
time out
time out
ready
result is 8
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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...