1. 程式人生 > >C++11 併發指南一(C++11 多執行緒初探)

C++11 併發指南一(C++11 多執行緒初探)

引言

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++之父 Bjarne Stroustrup 的關於 C++11 的 FAQ 也是必看的,我也收集了一些關於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 的介紹將在後續的一系列部落格中寫出,希望自己勤快一點吧 ;-)