std::thread详解
生活随笔
收集整理的這篇文章主要介紹了
std::thread详解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
轉(zhuǎn)自:http://www.cnblogs.com/haippy/p/3236136.html
上一篇博客《C++11 并發(fā)指南一(C++11 多線程初探)》中只是提到了 std::thread 的基本用法,并給出了一個(gè)最簡單的例子,本文將稍微詳細(xì)地介紹 std::thread 的用法。
std::thread 在 <thread> 頭文件中聲明,因此使用 std::thread 時(shí)需要包含 <thread> 頭文件。
std::thread 構(gòu)造
| thread() noexcept; |
| template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); |
| thread (const thread&) = delete; |
| thread (thread&& x) noexcept; |
- (1). 默認(rèn)構(gòu)造函數(shù),創(chuàng)建一個(gè)空的 thread 執(zhí)行對(duì)象。
- (2). 初始化構(gòu)造函數(shù),創(chuàng)建一個(gè) thread對(duì)象,該 thread對(duì)象可被 joinable,新產(chǎn)生的線程會(huì)調(diào)用 fn 函數(shù),該函數(shù)的參數(shù)由 args 給出。
- (3). 拷貝構(gòu)造函數(shù)(被禁用),意味著 thread 不可被拷貝構(gòu)造。
- (4). move 構(gòu)造函數(shù),move 構(gòu)造函數(shù),調(diào)用成功之后 x 不代表任何 thread 執(zhí)行對(duì)象。
- 注意:可被 joinable 的 thread 對(duì)象必須在他們銷毀之前被主線程 join 或者將其設(shè)置為 detached.
std::thread 各種構(gòu)造函數(shù)例子如下(參考):
#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 賦值操作,如果當(dāng)前對(duì)象不可 joinable,需要傳遞一個(gè)右值引用(rhs)給 move 賦值操作;如果當(dāng)前對(duì)象可被 joinable,則 terminate() 報(bào)錯(cuò)。
- (2). 拷貝賦值操作被禁用,thread 對(duì)象不可被拷貝。
請(qǐng)看下面的例子:
#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 ---------- */其他成員函數(shù)
- get_id
- joinable
- join
- detach
- swap
- native_handle
- hardware_concurrency [static]
總結(jié)
以上是生活随笔為你收集整理的std::thread详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2010常见错误记录
- 下一篇: 中科慧眼双目安装pcl