C 多執行緒程式設計

2022-09-08 05:30:12 字數 2624 閱讀 7431

多執行緒是學習slam過程中不可缺少的一步,正確的使用多執行緒能使slam系統的執行速度提公升很多,達到更高的精度和速度。本節就來學習slam中的多執行緒程式設計方法。

執行緒在unix系統下,通常被稱為輕量級的程序,執行緒雖然不是程序,但卻可以看作是unix程序的表親,同一程序中的多條執行緒將共享該程序中的全部系統資源,如虛擬位址空間,檔案描述符和訊號處理等等。但同一程序中的多個執行緒有各自的呼叫棧(call stack),自己的暫存器環境(register context),自己的執行緒本地儲存(thread-local storage)。 乙個程序可以有很多執行緒,每條執行緒並行執行不同的任務。

執行緒可以提高應用程式在多核環境下處理諸如檔案i/o或者socket i/o等會產生堵塞的情況的表現效能。在unix系統中,乙個程序包含很多東西,包括可執行程式以及一大堆的諸如檔案描述符位址空間等資源。在很多情況下,完成相關任務的不同**間需要交換資料。如果採用多程序的方式,那麼通訊就需要在使用者空間和核心空間進行頻繁的切換,開銷很大。但是如果使用多執行緒的方式,因為可以使用共享的全域性變數,所以執行緒間的通訊(資料交換)變得非常高效。

乙個簡單的demo

#include

#include

#include

using

namespace

std;

void

helloworld

()int

main

()

多執行緒庫

c++11中終於提供了多執行緒的標準庫,提供了執行緒管理、保護共享資料、執行緒間同步操作、原子操作等類。

多執行緒庫對應的標頭檔案是#include,類名為std::thread

乙個簡單的序列程式如下:

#include

#include

void

function_1

()int

main

()

這是乙個典型的單執行緒的單程序程式,任何程式都是乙個程序,main()函式就是其中的主線程,單個執行緒都是順序執行。

將上面的程式改造成多執行緒程式其實很簡單,讓function_1()函式在另外的執行緒中執行:

#include

#include

void

function_1

()int

main

()

分析:

首先,構建乙個std::thread物件t1,構造的時候傳遞了乙個引數,這個引數是乙個函式,這個函式就是這個執行緒的入口函式,函式執行完了,整個執行緒也就執行完了。

執行緒建立成功後,就會立即啟動,並沒有乙個類似start的函式來顯式的啟動執行緒。

一旦執行緒開始執行, 就需要顯式的決定是要等待它完成(join),或者分離它讓它自行執行(detach)。注意:只需要在std::thread物件被銷毀之前做出這個決定。這個例子中,物件t1是棧上變數,在main函式執行結束後就會被銷毀,所以需要在main函式結束之前做決定。

這個例子中選擇了使用t1.join(),主線程會一直阻塞著,直到子執行緒完成,join()函式的另乙個任務是**該執行緒中使用的資源。

執行緒物件和物件內部管理的執行緒的生命週期並不一樣,如果執行緒執行的快,可能內部的執行緒已經結束了,但是執行緒物件還活著,也有可能執行緒物件已經被析構了,內部的執行緒還在執行。

執行緒建立

下面的程式,我們可以用它來建立乙個 posix 執行緒:

#include 

pthread_create (thread, attr, start_routine, arg)

在這裡,pthread_create建立乙個新的執行緒,並讓它可執行。下面是關於引數的說明:

引數描述

thread

指向執行緒識別符號指標。

attr

乙個不透明的屬性物件,可以被用來設定執行緒屬性。您可以指定執行緒屬性物件,也可以使用預設值 null。

start_routine

執行緒執行函式起始位址,一旦執行緒被建立就會執行。

arg執行函式的引數。它必須通過把引用作為指標強制轉換為 void 型別進行傳遞。如果沒有傳遞引數,則使用 null。

建立執行緒成功時,函式返回 0,若返回值不為 0 則說明建立執行緒失敗。

終止執行緒

使用下面的程式,我們可以用它來終止乙個 posix 執行緒:

#include

pthread_exit (status)

如果 main() 是在它所建立的執行緒之前結束,並通過 pthread_exit() 退出,那麼其他執行緒將繼續執行。否則,它們將在 main() 結束時自動被終止。

打賞

C 多執行緒程式設計

一 thread 基礎 程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。而乙個程序又是由多個執行緒所組成的。執行緒 執行緒是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 區是共享的,即不同的執行緒可以執行同樣的函式 方...

C 多執行緒程式設計

乙個程序通常定義為程式的乙個例項。在win32中,程序佔據4gb的位址空間。與它們在ms dos和16位windows作業系統中不同,win32程序是沒有活力的。這就是說,乙個win32程序並不執行什麼指令,它只是佔據著4gb的位址空間,此空間中有應用程式exe檔案的 和資料。exe需要的任意dll...

C 多執行緒程式設計

建立執行緒的函式 handle createthread lpsecurity attributes lpthreadattributes,使用預設安全形態,設為null,表明不可被子執行緒繼承 size t dwstacksize,初始棧大小,預設值0表示使用與呼叫該函式的執行緒相同的棧大小 lp...