天天看點

C++11多線程學習-1

說明

最近打算好好學習多線程程式設計,特從網上和書籍中翻閱相關資料進行學習。據說C++11多線程主要以《C++ Concurrency In Action》這本書作為學習素材,打算先通過網上學習,如果需要在進行購買此書籍。

并發概述

談及到多線程程式設計,那麼首先需要了解并發的概念。何謂并發,我們可以這樣形象的了解,比如說人在行走過程中可以唱歌,行走和唱歌是兩件事情,但是他們是并發執行的。将這種行為映射到計算機領域進行了解為一個處理器同時運作多個應用程式,或者多個處理器,但是每個處理器處理不一樣的事情。

通過圖形化方式進行說明可能更加形象,圖例為盜用别人繪制的結果,隻為說明:

C++11多線程學習-1

在上圖中,雙核甚至多核才是我們真正心中所想的多線程并行技術,單核情況實際處理是通過程式進行多任務切換方式實作的并發效果。但是,在實際的使用過程中,雙核甚至多核的實際使用情況可能是下面這種情況:

C++11多線程學習-1

這種情況主要是考慮到充分利用計算機性能。

并發的實作

并發的實作可以使用多程序(Multi-Process)或者多線程(MultiThread)的方式,多程序的優勢在于各個程序之間互不幹擾,但是可能需要程序間的互相通信處理。多線程的處理方式是一種輕量級的程序方式,多個線程可以共享資源,但是它們之間可能會出現競争的問題。多程序和多線程的處理方式可以用下面示例說明:

為了完成一個任務需要多個人合作完成,多程序的方式好比把這些人配置設定到不同的辦公室,他們之間互相獨立,可以做自己該做的事情,也不用擔心自己需要某件辦公裝置時被其他人占用,但是帶來的問題是它們經常需要走出自己的辦公室與其他同僚交流關于任務的完成情況(也就是程序間的通信IPC)。 

多線程的方式好比把所有人集中在一個辦公室工作,他們之間的交流十分友善,但是帶來的問題是需要共享辦公裝置時常常需要等待

C++11中提供适用于跨平台的多線程方式,下面對C++11下的HelloWorld做一個簡單的說明

#include <iostream>
#include <thread>

using namespace std;

void hello() 
{
    cout << "Hello World!" << endl
}

int main()
{
    thread t(hello);
    t.join();
    
    return 0;
}
           

C++11中的多線程通過std::thread建立,通過一個可調用對象來初始化它。主線程等待線程t執行結束。

Thread類中的join()方法能夠将兩個交替執行的線程合并為順序執行的線程,比如說線上程B中調用線程A的jion()方法,線程A将插入線程B之前,直到線程A執行完畢後才會繼續執行線程B。

繼續閱讀