c 多執行緒初步學習

2021-09-13 12:07:26 字數 3468 閱讀 1897

c++多執行緒學習

本人使用環境 manjaro  ide為vscode  c++11,

這裡需要注意,對於執行緒相關**編譯時需加入 -lpthread 即 g++ a.cpp -lpthread

否則會顯示undefined reference to `pthread_create'

我這裡使用為vscode按照剛開始配置檔案無法通過vsc直接編譯,但是可以修改tasks.json檔案

在args裡面加入 "-lpthread"即可  以下給我我的配置檔案 修改後可直接編譯執行

",

"-o", // 指定輸出檔名,不加該引數則預設輸出a.exe,linux下預設a.out

"$/$.exe",

"-g", // 生成和除錯有關的資訊

"-wall", // 開啟額外警告

"-static-libgcc", // 靜態鏈結

"-lpthread",

"-fcolor-diagnostics", // 彩色的錯誤資訊?但貌似clang預設開啟而gcc不接受此引數

"-std=c++11" // c語言最新標準為c11,或根據自己的需要進行修改

], // 編譯命令引數

"type": "shell", // 可以為shell或process,前者相當於先開啟shell再輸入命令,後者是直接執行命令

"group": ,

"presentation":

// "problemmatcher":"$gcc" // 如果你不使用clang,去掉前面的注釋符,並在上一條之後加個逗號。照著我的教程做的不需要改(也可以把這行刪去)}]

}

接下開始學習多執行緒:

首先是執行緒的建立

pthread_create (thread, attr, start_routine, arg)
該函式有4個引數,分別代表

thread

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

attr

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

start_routine

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

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

看起來可能不是很清楚,直接上**。

#include #includeusing namespace std;

const int maxn=5

void *printhello(void *threadid)

int main ()

}pthread_exit(null);

}

這裡有個問題,如果pringhello函式裡沒有pthread_exit()函式的話,程式會執行到一半正常終止,目前我也不知道是什麼原因,猜測可能是執行緒沒有執行完結果程序直接結束了,導致後續執行緒無法執行。

#include using namespace std;

const int maxn=5;

struct thread_data//建立乙個結構體 格式為將傳入的引數

;void *print(void *threadarg)//函式這裡傳入的仍未空指標

pthread_attr_t;

使用join來連線線程

#include #include #include #include using namespace std;

#define num_threads 5

void *wait(void *t)

int main ()

}// 刪除屬性,並等待其他執行緒

pthread_attr_destroy(&attr);

for( int i = 0; i < num_threads; ++i )

cout << "main: program exiting." << endl;

pthread_exit(null);

}

輸出結果

main() : creating thread, 0

main() : creating thread, 1

main() : creating thread, 2

main() : creating thread, 3

main() : creating thread, 4

sleeping in thread

sleeping in thread

sleeping in thread

sleeping in thread

sleeping in thread

pthread_join get status:10

pthread_join get status:11

pthread_join get status:12

pthread_join get status:13

pthread_join get status:14

main: program exiting.

互斥鎖機制

#includeusing namespace std;

const int maxn=5;

int sum=0; //建立全域性變數 所有執行緒同時寫 需要鎖機制

pthread_mutex_t sum_mutex;//建立互斥鎖

void* say(void *args)

else if(!sign)

pthread_mutex_unlock(&tasks_mutex);//解鎖

if(tasks==0) break;

}pthread_exit(0);

}void* say_1(void *args)

{ pthread_t pid=pthread_self();

cout << "[" << pid << "] hello in thread " << *( ( int* )args ) << endl;

while(1)

{pthread_mutex_lock(&tasks_mutex);//加鎖

if(tasks>maxn)

{cout << "[" << pid << "] pthread_cond_signal in thread " << *( ( int* )args ) << endl;

pthread_cond_wait(&tasks_cond,&tasks_mutex);

cout<<"---"《通過上述**可以發現,開始執行執行緒1,然後執行到pthread_cond_wait(&tasks_cond,&tasks_mutex);,該執行緒進入喚醒狀態,等待訊號量生效,同時從該位置終止執行緒,進入執行緒2,完成任務後(即tasks小於5),傳送訊號量,同時該執行緒2結束,進入執行緒1等待的位置重新執行。

初步學習多執行緒2

執行緒 展示 兔子執行緒實現runnable介面 package thread 兔子的執行緒 author superdrew public class rabbitthread implements runnable 測試執行緒 package thread 功能 龜兔賽跑 實現方法二 使用執行緒...

多執行緒初步理解

題目 某銀行有至多三個視窗提供服務。該銀行每天至多服務100人次 初始時,只有乙個視窗開放,如果等待人數超過兩人 包含正在辦理業務的人 才開放下乙個視窗。這個小小的問題裡面包含幾個關鍵點 顯然三個視窗可以用三個執行緒來做,那麼如何得到三個執行緒服務的總人數?涉及到多執行緒資料同步問題。100人次可能...

C 多執行緒學習

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