C++11 多執行緒學習----std::thread類的簡單使用
一 C++11多執行緒簡介
C++11標準庫會提供類thread
(std::thread
)。若要執行一個執行緒,可以建立一個類thread
的實體,其初始引數為一個函式物件,以及該函式物件所需要的引數。通過成員函式std::thread::join()
對執行緒會合的支援,一個執行緒可以暫停直到其它執行緒執行完畢。若有底層平臺支援,成員函式std::thread::native_handle()
將可提供對原生執行緒物件執行平臺特定的操作。對於執行緒間的同步,標準庫將會提供適當的互斥鎖(像是std::mutex
,std::recursive_mutex
等等)和條件引數(std::condition_variable
和std::condition_variable_any
)。前述同步機制將會以RAII鎖(std::lock_guard
和std::unique_lock
)和鎖相關演算法的方式呈現,以方便程式設計師使用。
對於要求高效能,或是極底層的工作,有時或甚至是必須的,我們希望執行緒間的通訊能避免互斥鎖使用上的開銷。以原子操作來訪問記憶體可以達成此目的。針對不同情況,我們可以通過顯性的記憶體屏障改變該訪問記憶體動作的可見性。
對於執行緒間非同步的傳輸,C++11標準庫加入了以及std::packaged_task
用來包裝一個會傳回非同步結果的函式呼叫。因為缺少結合數個future的功能,和無法判定一組promise
更高階的執行緒支援,如執行緒池,已經決定留待在未來的TechnicalReport加入此類支援。更高階的執行緒支援不會是C++11的一部分,但設想是其最終實現將建立在目前已有的執行緒支援之上。
std::async
提供了一個簡便方法以用來執行執行緒,並將執行緒繫結在std::future
。使用者可以選擇一個工作是要多個執行緒上非同步的執行,或是在一個執行緒上執行並等待其所需要的資料。預設的情況,實現可以根據底層硬體選擇前面兩個選項的其中之一。另外在較簡單的使用情形下,實現也可以利用執行緒池提供支援。
二 簡單std::thread的使用
#include <iostream>
#include <thread>
using namespace std;
void myFirstThread()
{
cout << "Hello thread" << endl;
}
int main()
{
thread myThread(myFirstThread);
myThread.join();
return 0;
}
三 std::thread類建構函式函式簡介
std::thread構造
1 預設構造,建立一個空的thread物件,以下為預設建構函式宣告:
thread() noexcept;
2拷貝構造 copy-delete(thread物件不可拷貝構造):
thread (const thread&) = delete;
3初始化構造,建立thread物件,該物件可被joinable,執行緒會呼叫fn函式,引數由args給出,下邊為初始化構造 函式宣告:
template <class Fn, class... Args>
explicit thread (Fn&& fn,Args&&... args);
4移動構造 move,此建構函式呼叫成功之後,x不代表任何thread可執行物件。
thread (thread&& x) noexcept;
注意:可被joinable的thread物件必須在他們銷燬之前被主執行緒join或者將之設定為detached。
std::thread各種建構函式示例如下:
#include <iostream>
#include <thread>
using namespace std;
void myFirstThreadTask(int num)
{
for (int i = 0; i < 10; ++i)
{
cout << "myFirstThreadTask's num = " << num++ << endl;
this_thread::sleep_for(chrono::milliseconds(10));
}
}
void mySecondThreadTask(int &num)
{
for (int i = 0; i < 10; ++i)
{
cout << "mySecondThreadTask's num = " << num++ << endl;
this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
int main(int argc, _TCHAR* argv[])
{
int n = 5;
thread myThread0;//myThread1為一個空執行緒,不代表任何可執行物件
//myThread1與myFirstThreadTask函式繫結,n為其按值傳遞引數
thread myThread1(myFirstThreadTask,n);
//myThread2與mySecondThreadTask函式繫結,n為其引用傳遞引數
thread myThread2(mySecondThreadTask,std::ref(n));
//現在myThread2不代表任何可執行物件,myThread3與mySecondThreadTask函式繫結
thread myThread3(std::move(myThread2));
myThread1.join();
myThread3.join();
//myThread3.join();
return 0;
}
相關推薦
C++11 多執行緒學習----std::thread類的簡單使用
一 C++11多執行緒簡介 C++11標準庫會提供類thread(std::thread)。若要執行一個執行緒,可以建立一個類thread的實體,其初始引數為一個函式物件,以及該函式物件所需要的
基於C++11併發庫的執行緒池與訊息佇列多執行緒框架——std::thread類
1 前言 C++11標準在標準庫中為多執行緒提供了元件,這意味著使用C++編寫與平臺無關的多執行緒程式成為可能,而C++程式的可移植性也得到了有力的保證。 在之前我們主要使用的多執行緒庫要麼是屬於某個單獨平臺的,例如:POSIX執行緒庫(Linux),Windows
C++ 11 多執行緒下std::unique_lock與std::lock_guard的區別和用法
這裡主要介紹std::unique_lock與std::lock_guard的區別用法 先說簡單的 一、std::lock_guard的用法 std::lock_guard其實就是簡單的RAII封裝,在建構函式中進行加鎖,解構函式中進行解鎖,這樣可以保證函式退出時,鎖一定被釋放。 簡單來說,就是防止開
c++11多執行緒:std::future , std::promise和執行緒的返回值
std::future物件可以和asych,std::packaged_task,std::promise一起使用。這篇文章集中討論std::future和std::promise。 我們經常會遇到需要得到執行緒返回結果的情況,現在的問題是我們如何實現。 舉個例子: 假設
Posix執行緒和C++11多執行緒學習
在C++11引進多執行緒之前,我們不得不使用POSIX pthreads,因此本文主要包括三部分: POSIX多執行緒實踐 C++11 多執行緒實踐 類成員函式作為執行緒函式的實現 一、POSIX多執行緒實踐 一個簡單執行緒的實現 建立一個執行緒,該執
C++11多執行緒std::thread的簡單使用
在cocos2dx 2.0時代,我們使用的是pthread庫,是一套使用者級執行緒庫,被廣泛地使用在跨平臺應用上。但在cocos2dx 3.0中並未發現有pthread的支援檔案,原來c++11中已經擁有了一個更好用的用於執行緒操作的類std::thread。cocos
一、C++11多執行緒std::thread的簡單使用(上)
出處:http://blog.csdn.net/star530/article/details/24186783 昨天練車時有一MM與我交替著練,聊了幾句話就多了起來,我對她說:”看到前面那倆教練沒?老色鬼兩枚!整天調戲女學員。“她說:”還好啦,這畢竟是他們的樂趣所在,你不
Cocos2dx 3.0 過渡篇(二十六)C++11多執行緒std::thread的簡單使用
--------------- 《上》 本篇介紹的是執行緒! 在cocos2dx 2.0時代,我們使用的是pthread庫,是一套使用者級執行緒庫,被廣泛地使用在跨平臺應用上。但在cocos2dx 3.0中並未發現有pthread的支援檔案,原來c++11中已經擁有了一
C++多執行緒之std::thread
C++11,包含標頭檔案 thread.h,並使用名稱空間std。 thread類提供的方法 方法 描述 thread 建構函式,在這裡傳入執行緒執行函式,和函式引數
c++11多執行緒 thread
1.thread建構函式 default (1) thread() noexcept; initialization (2) template <class Fn, class... Args> explicit
C++11多執行緒------std::async
std::async可以認為是封裝了一個std::promise,該函式返回一個std::future,用於獲取其他執行緒的資料。 一般有兩種模式: std::lanch::async:最常用的非同步模式,每次都要執行一遍 std::lanch::defer:只在第
C++11多執行緒程式設計 第九章: std::async 更更優雅的寫多執行緒
C++11 Multithreading – Part 9: std::async Tutorial & Example Varun May 5, 2017 C++11 Multithreading – Part 9: std::async Tutorial &
C++11多執行緒程式設計 第八章: 使用 std::future std::promise 更優雅的獲取執行緒返回值
C++11 Multithreading – Part 8: std::future , std::promise and Returning values from Thread Varun June 20, 2015 C++11 Multithreading – Part
C++11多執行緒(十一):《atomic型別詳解二:std::atomic》
參考連結: http://www.cnblogs.com/haippy/p/3301408.html 不錯的部落格 http://www.cplusplus.com/reference/future/future/ cplusplus官網 目錄 1.std::atomic 基本介紹 2.std::atomic
C++11多執行緒thread引數傳遞問題
目錄 寫在前面 thread類的建構函式 join函式 detach函式 thread中引數傳遞 類物件作為引數 類中函式作為引數 參考書籍 寫在前面 多執行緒在很多地方都是必須要掌握的方法,這裡先說一下,thread物件的引數傳遞問題 thread類
C++11多執行緒(七):《 詳解三:std::future & std::shared_future》
#include <iostream> // std::cout #include <future> // std::async, std::future #include <chrono>
C++11多執行緒(十一):《atomic 型別詳解三 std::atomic (續)》
參考連結:http://www.cnblogs.com/haippy/p/3304556.html 本文介紹C++11 標準庫中的 std::atomic 針對整形(integral)和指標型別的特化版本做了哪些改進。
[轉]c++11 多執行緒 future/promise
[轉自 https://blog.csdn.net/jiange_zh/article/details/51602938] 1. < future >標頭檔案簡介 Classes std::future std::future_error std::packaged_task std::pro
C++11 多執行緒執行緒共享資料
共享資料的問題 這些在作業系統中都有詳細的介紹,可以回顧作業系統課程。。很典型的就是資料競爭問題。 互斥量保護資料 最原始的方式:使用std::mutex建立互斥量,使用成員lock()加鎖,使用成員unlock()解鎖。但是這種方式需要我們在每個函數出口都呼叫一次unloc
qt多執行緒之 std::thread
不時見到有人會這樣做: 不使用QThread,而是使用pthread等平臺相關的底層 api 而又不想使用底層執行緒間同步、通訊的api 那麼,如何使用pthread,而又使用Qt提供的執行緒間機制呢? 本文的初衷源於此,但是使用的的是C++0x 的 std::threa