我正在撰寫一個多執行緒程式。linux手冊中對pthread_join的介紹是:
The pthread_join() function waits for the thread specified by thread to terminate.
我很好奇這句話是不是意味著主執行緒和子執行緒分開運行,但是當子執行緒結束時,主執行緒可以結束。
Child1 thread: 0
Child1 thread: 1
...
Child1 thread: 9999
Parent thread: 0
...
Parent thread: 99
結果總是子執行緒結束后,會執行主執行緒后面的for回圈。這是否意味著pthread_join執行子執行緒,阻塞主執行緒,并在子執行緒結束時執行主執行緒?
但是當我洗掉下面代碼的注釋,即創建兩個子執行緒時,并沒有出現預期的現象。子執行緒 1 和子執行緒 2 交叉運行。當子執行緒 1 和子執行緒 2 完成后,主執行緒之后的 for 回圈pthread_join開始運行。
有人可以更清楚地解釋如何pthread_join運行子執行緒和主執行緒嗎?
#define _GNU_SOURCE
#include<stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sched.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include "../utils/memory_utils.h"
#include "../utils/cache_utils.h"
#include "../utils/misc_utils.h"
void function(char *str){
for(int i=0;i<10000;i ){
printf("%s thread: %d\n", str, i);
}
}
int main(){
char *str = "string";
pthread_t start,start_2;
if (pthread_create(&start, NULL, (void *)function, "Child1") != 0) {
perror("pthread_create: trojan");
}
// if (pthread_create(&start_2, NULL, (void *)function, "Child2") != 0) {
// perror("pthread_create: trojan");
// }
pthread_join(start, NULL);
// pthread_join(start_2, NULL);
for(int i=0;i<100;i ){
printf("Parent thread: %d\n", i);
}
return 0;
}
uj5u.com熱心網友回復:
pthread_join()相當簡單。根據其檔案:
該
pthread_join()函式等待由 指定的執行緒thread終止。如果該執行緒已經終止,則pthread_join()立即回傳。
也就是說,是的,pthread_join()在必要和適當的時候阻止呼叫者。但它對呼叫者以外的任何執行緒都沒有影響,甚至對加入的執行緒也沒有影響,并且當前運行的執行緒數與pthread_join()s 行為沒有直接關系。
您問,
這是否意味著
pthread_join執行子執行緒,阻塞主執行緒,并在子執行緒結束時執行主執行緒?
不。
每次成功呼叫都會pthread_create()啟動一個新執行緒,該執行緒與行程中的所有其他執行緒并行運行。如果系統有多個執行單元,就像現在大多數一樣,那么這些并行執行緒中的一些可能會在某些時候在不同的執行單元上并發運行。無論有多少執行單元可用,包括如果只有一個,執行緒都將共享這些執行單元。
調度執行緒的執行時間是作業系統的一項功能。不需要額外的函式呼叫來實作它,特別是pthread_join()與使執行緒運行無關。它的作業是等待指定執行緒完成運行,并可選擇提供該執行緒的回傳值。就這樣。并且當它完成該任務并回傳時,執行pthread_join()呼叫的執行緒的執行將正常繼續,就像從任何其他函式呼叫回傳時一樣。
你問,
有人可以更清楚地解釋如何
pthread_join運行子執行緒和主執行緒嗎?
pthread_join()不做任何這些事情,除非它的回傳允許呼叫它的執行緒繼續。
當一個執行緒被阻塞時pthread_join(),對其他執行緒的執行沒有影響。如前所述,所有正在運行的、未阻塞的執行緒將并行執行,并且可能同時執行。然而很多。執行緒并行運行是它們的關鍵特征之一。
所以是的,如果初始執行緒啟動另外兩個執行緒然后嘗試加入其中一個,那么這兩個附加執行緒很可能會“交叉”執行。如果您(根本)不想要那個,那么您就不需要執行緒。如果您想控制它,那么這是同步工具(例如互斥鎖和條件變數)的主要功能之一。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/527268.html
標籤:C多线程线程
下一篇:在腳本中實作多執行緒/并行處理
