【C/C++開發】C++11 并發指南二(std::thread 詳解)

上一篇博客《C++11 并發指南一(C++11 多線程初探)》中只是提到了 std::thread 的基本用法,并給出了一個最簡單的例子,本文將稍微詳細地介紹 std::thread 的用法。

std::thread 在 <thread> 頭文件中聲明,因此使用 std::thread 時需要包含 <thread> 頭文件。

std::thread 構造

default (1)
thread() noexcept;
initialization (2)
template <class Fn, class... Args>
explicit thread (Fn&& fn, Args&&... args);
copy [deleted] (3)
thread (const thread&) = delete;
move (4)
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 賦值操作

move (1)
thread& operator= (thread&& rhs) noexcept;
copy [deleted] (2)
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]

轉載于:https://www.cnblogs.com/huty/p/8516998.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【找工作資料】外企面試技巧

這里談談面試的技巧。這是根據誠迅聯豐咨詢公司許國慶在北大光華管理學院、經濟學院和清華經濟管理學院的講座整理出來的。他曾在美國的投資銀行和商業銀行工作了近十年。 一、面試前的準備 1&#xff0e;確定3W 明確面試前的三要素&#xff0d;When (時間)、Where&#xf…

觸摸屏Sensor疊構實例學習記錄(一)

現在從事TP這個行業&#xff0c;看再多的資料和介紹&#xff0c;不如直接拿個實例的工程圖來看&#xff0c;分析每一部分具體是什么東西&#xff0c;比看再多的資料更容易入門。 以下圖紙和圖片都是我從網上隨便下的&#xff0c;僅次于學習記錄使用&#xff0c;不做另外的商業用…

linux查找influx的安裝位置,InfluxDB學習之InfluxDB的安裝和簡介 | Linux大學

最近用到了 InfluxDB&#xff0c;在此記錄下學習過程&#xff0c;同時也希望能夠幫助到其他學習的同學。本文主要介紹InfluxDB的功能特點以及influxDB的安裝過程。更多InfluxDB詳細教程請看&#xff1a;InfluxDB系列學習教程目錄一、InfluxDB 簡介InfluxDB 是用Go語言編寫的一個…

Python 之數據類型

文章收集于網絡&#xff0c;如有版權&#xff0c;請聯系作者 一、引子 1 什么是數據&#xff1f; x10&#xff0c;10是我們要存儲的數據 2 為何數據要分不同的類型 數據是用來表示狀態的&#xff0c;不同的狀態就應該用不同的類型的數據去表示 3 數據類型 數字、字符串、列表…

Jquery中$(document).ready(function(){ })函數的使用詳解

Jquery是優秀的Javascrīpt框架,$是jquery庫的申明&#xff0c;它很不穩定&#xff08;我就常遇上&#xff09;,換一種穩定的寫法jQuery.noConflict(); jQuery(document).ready(function(){}); 使用jQuery的好處是它包裝了各種瀏覽器版本對DOM對象(javascript的DOM對象你應該知…

爬蟲數據executemany插入_金融數據的獲取——一個爬蟲的簡單例子

對量化投資策略進行研究&#xff0c;第一步就是獲取我們需要的數據。使用歷史數據能夠對策略進行回測&#xff0c;以驗證策略的有效性和可信性。另一方面&#xff0c;量化投資本身也是一種對數據的研究&#xff0c;因此它也必須遵循數據分析的相關步驟。作為一個業余的量化投資…

洛谷 P1736 創意吃魚法

P1736 創意吃魚法 題目描述 回到家中的貓貓把三桶魚全部轉移到了她那長方形大池子中&#xff0c;然后開始思考&#xff1a;到底要以何種方法吃魚呢&#xff08;貓貓就是這么可愛&#xff0c;吃魚也要想好吃法 ^_*&#xff09;。她發現&#xff0c;把大池子視為01矩陣&#xff0…

程序員面試中遇到問題

面試時候經常會問的一些問題(不斷補充中) 面試必備基礎題目(雖然不一定常用, 僅用于面試, 面試就是把人搞的都不會然后砍價, 當然您可以講我可以查資料完成, 但是面試的時候就是沒道理的, 起碼我是經常看到這些題). 如何把一段逗號分割的字符串轉換成一個數組? request.getAtt…

linux檢查swap配置,Linux環境下swap配置方法

8種機械鍵盤軸體對比本人程序員&#xff0c;要買一個寫代碼的鍵盤&#xff0c;請問紅軸和茶軸怎么選&#xff1f;前言安裝Linux系統之后&#xff0c;默認是沒有swap分區&#xff0c;那么我們怎樣增加和刪除swap分區。配置swap步驟1) 內存占用情況1free -hSwap: 0B 0B 0B2) 通過…

react學習系列1 修改create-react-app配置支持stylus

注&#xff1a;由于前端更新非常快&#xff0c;寫這篇文章時 create-react-app 使用的版本是1.4.1 最新的使用流程請參照官方文檔。create-react-app 是facebook推出的快速創建react項目的命令行工具。 他和 vue-cli 類似。開箱即用&#xff0c;不用改一行配置就可以開發出針對…

Python 內置模塊之 時間模塊 datetime

概述 datatime模塊重新封裝了time模塊&#xff0c;提供更多接口&#xff0c;datetime庫定義了2個常量和5個類。 2個常量分別是&#xff1a; MINYEAR1MAXYEAR9999 5個類分別是&#xff1a; date類&#xff1a;表示日期的類time類&#xff1a;表示時間的類datetime類&#xf…

python自學網站需要多長時間-怎么自學python,大概要多久?

我潑點冷水&#xff1a;建議還是要慎重選擇上來新手就自學Python。如果想認認真真打好基礎&#xff0c;還是要至少從Java學起。換句話說&#xff0c;先學會Java&#xff0c;然后再學Python不遲。 Python的最大優勢是簡單明快&#xff0c;最大問題也是簡單明快。 我面試過很多用…

[c/c++] programming之路(25)、字符串(六)——memset,Unicode及寬字符,strset

一、memset #include<stdio.h> #include<stdlib.h> #include<memory.h>void *mymemset(void *p, int num, int len) {char *px (char *)p;if (p NULL)return NULL;while (len>0){*px (char)num;px;len--;}return p;//因為上述代碼是對px進行操作&#…

linux切換sid,linux – 將sid字段添加到ps -f輸出

我正在閱讀ps手冊頁,有一些我不明白的東西.-f does full-format listing. This option can be combined with many otherUNIX-style options to add additional columns. It also causes thecommand arguments to be printed. When used with -L, the NLWP (number ofthreads) …

使用Cross-Page Postback(跨頁面提交)在頁面間傳遞數據

頁面間傳遞數據的幾種方法 在頁面間傳遞數據時&#xff0c;我們有以下幾種選擇&#xff1a; 1、Query String 一個很常見的方法&#xff0c;Query String是URL中問號之后的那一部分。其優點在于它是輕量級的&#xff0c;不會給服務器帶來任何負擔。而它也有幾個缺點&#xff1a…

synchronized 和 lock 的區別

lock更靈活&#xff0c;可以自由定義多把鎖的加鎖解鎖順序&#xff08;synchronized要按照先加的后解順序&#xff09; 提供多種加鎖方案&#xff0c;lock 阻塞式, trylock 無阻塞式, lockInterruptily 可打斷式&#xff0c; 還有trylock的帶超時時間版本。 本質上和監視器鎖&a…

win10怎么設置默認輸入法_win10系統輸入法失效打不了字怎么辦

大家好&#xff0c;今天分享一篇來自小白系統官網(xiaobaixitong.com)的圖文教程。最近有用戶反映自己電腦上的win10系統出現輸入法失效打不了字的問題&#xff0c;想知道有沒有解決該問題的方法。小編經過一番查找后給大家整理出了針對該問題的解決方法&#xff0c;下面就讓我…

Python 內置模塊之 時間模塊 time

time模塊提供各種時間相關的功能,與時間相關的模塊有&#xff1a;time,datetime,calendar 必要說明&#xff1a; 這個模塊的功能不是適用于所有的平臺 這個模塊中定義的大部分函數是調用C平臺上的同名函數實現 一些術語和約定的解釋&#xff1a; 時間戳(timestamp)的方式,返…

linux找link原路徑,readlink命令找出符號鏈接所指向的位置

1.釋義找出符號鏈接所指向的位置2.系統幫助用法&#xff1a;readlink [選項]... 文件...輸出符號鏈接值或權威文件名。-f, --canonicalize遞歸跟隨給出文件名的所有符號鏈接以標準化&#xff0c;除最后一個外所有組件必須存在-e, --canonicalize-existing遞歸跟隨給出文件名的所…

國產毫米波雷達領域的領頭羊,木牛科技將在明年量產77GHz汽車雷達

國內的汽車毫米波雷達市場風潮起于2015年前后&#xff0c;彼時國內的毫米波雷達企業已經發展很多年&#xff0c;但大都在軍工領域。 面對突然出現的汽車毫米波雷達市場熱潮&#xff0c;國內很快涌現出了一大批雷達的初創企業&#xff0c;努力擠進這一亦新亦舊的市場。 說是新&a…