C++11 併發指南一(C++11 多執行緒初探)
阿新 • • 發佈:2018-12-30
引言
C++11 自2011年釋出以來已經快兩年了,之前一直沒怎麼關注,直到最近幾個月才看了一些 C++11 的新特性,今後幾篇部落格我都會寫一些關於 C++11 的特性,算是記錄一下自己學到的東西吧,和大家共勉。
相信 Linux 程式設計師都用過 Pthread, 但有了 C++11 的 std::thread 以後,你可以在語言層面編寫多執行緒程式了,直接的好處就是多執行緒程式的可移植性得到了很大的提高,所以作為一名 C++ 程式設計師,熟悉 C++11 的多執行緒程式設計方式還是很有益處的。
如果你對 C++11 不太熟悉,建議先看看維基百科上關於 C++11 新特性的介紹,中文C++11介紹
資料匯
好了,下面來說正題吧 ;-)
與 C++11 多執行緒相關的標頭檔案
C++11 新標準中引入了四個標頭檔案來支援多執行緒程式設計,他們分別是<atomic> ,<thread>,<mutex>,<condition_variable>和<future>。
- <atomic>:該頭文主要聲明瞭兩個類, std::atomic 和 std::atomic_flag,另外還聲明瞭一套 C 風格的原子型別和與 C 相容的原子操作的函式。
- <thread>:該標頭檔案主要聲明瞭 std::thread 類,另外 std::this_thread 名稱空間也在該標頭檔案中。
- <mutex>:該標頭檔案主要聲明瞭與互斥量(mutex)相關的類,包括 std::mutex 系列類,std::lock_guard, std::unique_lock, 以及其他的型別和函式。
- <condition_variable>:該標頭檔案主要聲明瞭與條件變數相關的類,包括 std::condition_variable 和 std::condition_variable_any。
- <future>:該標頭檔案主要聲明瞭 std::promise, std::package_task 兩個 Provider 類,以及 std::future 和 std::shared_future 兩個 Future 類,另外還有一些與之相關的型別和函式,std::async() 函式就宣告在此標頭檔案中。
std::thread "Hello world"
下面是一個最簡單的使用 std::thread 類的例子:
#include <stdio.h> #include <stdlib.h> #include <iostream> // std::cout #include <thread> // std::thread void thread_task() { std::cout << "hello thread" << std::endl; } /* * === FUNCTION ========================================================= * Name: main * Description: program entry routine. * ======================================================================== */ int main(int argc, const char *argv[]) { std::thread t(thread_task); t.join(); return EXIT_SUCCESS; } /* ---------- end of function main ---------- */
Makefile 如下:
all:Thread CC=g++ CPPFLAGS=-Wall -std=c++11 -ggdb LDFLAGS=-pthread Thread:Thread.o $(CC) $(LDFLAGS) -o [email protected] $^ Thread.o:Thread.cc $(CC) $(CPPFLAGS) -o [email protected] -c $^ .PHONY: clean clean: rm Thread.o Thread
注意在 Linux GCC4.6 環境下,編譯時需要加 -pthread,否則執行時會出現:
$ ./Thread terminate called after throwing an instance of 'std::system_error' what(): Operation not permitted Aborted (core dumped)
原因是 GCC 預設沒有載入 pthread 庫,據說在後續的版本中可以不用在編譯時新增 -pthread 選項。
更多的有關 C++11 Concurrency 的介紹將在後續的一系列部落格中寫出,希望自己勤快一點吧 ;-)