1. 程式人生 > >C++11 多執行緒學習----std::thread類的簡單使用

C++11 多執行緒學習----std::thread類的簡單使用

一 C++11多執行緒簡介

   C++11標準庫會提供類threadstd::thread)。若要執行一個執行緒,可以建立一個類thread的實體,其初始引數為一個函式物件,以及該函式物件所需要的引數。通過成員函式std::thread::join()對執行緒會合的支援,一個執行緒可以暫停直到其它執行緒執行完畢。若有底層平臺支援,成員函式std::thread::native_handle()將可提供對原生執行緒物件執行平臺特定的操作。對於執行緒間的同步,標準庫將會提供適當的互斥鎖(像是std::mutexstd::recursive_mutex等等)和條件引數(std::condition_variable

std::condition_variable_any)。前述同步機制將會以RAII鎖(std::lock_guardstd::unique_lock)和鎖相關演算法的方式呈現,以方便程式設計師使用。

對於要求高效能,或是極底層的工作,有時或甚至是必須的,我們希望執行緒間的通訊能避免互斥鎖使用上的開銷。以原子操作來訪問記憶體可以達成此目的。針對不同情況,我們可以通過顯性的記憶體屏障改變該訪問記憶體動作的可見性。

對於執行緒間非同步的傳輸,C++11標準庫加入了以及std::packaged_task用來包裝一個會傳回非同步結果的函式呼叫。因為缺少結合數個future的功能,和無法判定一組promise

集合中的某一個promise是否完成,futures此一提案因此而受到了批評。

更高階的執行緒支援,如執行緒池,已經決定留待在未來的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