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