C++11 并发指南二(std::thread 详解)
生活随笔
收集整理的這篇文章主要介紹了
C++11 并发指南二(std::thread 详解)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇博客《C++11 并發指南一(C++11 多線程初探)》中只是提到了 std::thread 的基本用法,并給出了一個最簡單的例子,本文將稍微詳細地介紹 std::thread 的用法。
std::thread 在 <thread> 頭文件中聲明,因此使用 std::thread 時需要包含 <thread> 頭文件。
std::thread 構造
| thread() noexcept; |
| template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); |
| thread (const thread&) = delete; |
| thread (thread&& x) noexcept; |
- (1). 默認構造函數,創建一個空的 thread 執行對象。
- (2). 初始化構造函數,創建一個 thread對象,該 thread對象可被 joinable,新產生的線程會調用 fn 函數,該函數的參數由 args 給出。
- (3). 拷貝構造函數(被禁用),意味著 thread 不可被拷貝構造。
- (4). move 構造函數,move 構造函數,調用成功之后 x 不代表任何 thread 執行對象。
- 注意:可被 joinable 的 thread 對象必須在他們銷毀之前被主線程 join 或者將其設置為 detached.
std::thread 各種構造函數例子如下(參考):
#include <iostream> #include <utility> #include <thread> #include <chrono> #include <functional> #include <atomic>void f1(int n) {for (int i = 0; i < 5; ++i) {std::cout << "Thread " << n << " executing\n";std::this_thread::sleep_for(std::chrono::milliseconds(10));} }void f2(int& n) {for (int i = 0; i < 5; ++i) {std::cout << "Thread 2 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));} }int main() {int n = 0;std::thread t1; // t1 is not a threadstd::thread t2(f1, n + 1); // pass by valuestd::thread t3(f2, std::ref(n)); // pass by referencestd::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a threadt2.join();t4.join();std::cout << "Final value of n is " << n << '\n'; }move 賦值操作
| thread& operator= (thread&& rhs) noexcept; |
| thread& operator= (const thread&) = delete; |
- (1). move 賦值操作,如果當前對象不可 joinable,需要傳遞一個右值引用(rhs)給 move 賦值操作;如果當前對象可被 joinable,則 terminate() 報錯。
- (2). 拷貝賦值操作被禁用,thread 對象不可被拷貝。
請看下面的例子:
#include <stdio.h> #include <stdlib.h>#include <chrono> // std::chrono::seconds #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::sleep_for void thread_task(int n) {std::this_thread::sleep_for(std::chrono::seconds(n));std::cout << "hello thread "<< std::this_thread::get_id()<< " paused " << n << " seconds" << std::endl; }/** === FUNCTION =========================================================* Name: main* Description: program entry routine.* ========================================================================*/ int main(int argc, const char *argv[]) {std::thread threads[5];std::cout << "Spawning 5 threads...\n";for (int i = 0; i < 5; i++) {threads[i] = std::thread(thread_task, i + 1);}std::cout << "Done spawning threads! Now wait for them to join\n";for (auto& t: threads) {t.join();}std::cout << "All threads joined.\n";return EXIT_SUCCESS; } /* ---------- end of function main ---------- */其他成員函數
- get_id
- joinable
- join
- detach
- swap
- native_handle
- hardware_concurrency [static]
總結
以上是生活随笔為你收集整理的C++11 并发指南二(std::thread 详解)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch之torch.nn.Sof
- 下一篇: 【Oracle】PL/SQL 显式游标、