我寫了下面程序來測試一些假設我對並行線程:Ç通過共享變量成並行線程
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
typedef struct threadArgs * ThreadArgs;
void *foo(void * argStruct);
struct threadArgs{
int pingBool;
};
int main(int argc, char const *argv[]){
pthread_t t1;
int pingBool = 1;
int ch;
ThreadArgs args = (ThreadArgs)malloc(sizeof(struct threadArgs));
args->pingBool = pingBool;
pthread_create(&t1, NULL, foo, args);
while((ch = getchar()) != EOF){
if(ch == 'q'){
pingBool = 0;
printf("pingBool now 0\n");
break;
}
}
pthread_join(t1, NULL);
printf("whole program terminating\n");
return 0;
}
void *foo(void * argStruct){
ThreadArgs args = argStruct;
while(args->pingBool == 1){
printf("t1 still going\n");
sleep(1);
}
printf("t1 finished\n");
return NULL;
}
基本上,它設置在main()
可變int pingBool = 1
,將其傳遞到其中循環,直至pingBool == 0
一個線程。 main()
然後設置pingBool = 0
,但是,線程繼續運行。我很確定發生這種情況,因爲pingBool
在放入結構中時被複制,並且只修改了main()
的本地副本。
有沒有一種方法可以像這樣在線程之間共享和修改變量?我知道我可以簡單地使pingBool
成爲一個全局變量,而不是將它傳遞給foo()
。但是,我寧願不這樣做。
注意:如果要測試需要使用-pthread或-lpthread編譯的代碼,具體取決於編譯器。即gcc -Wall -Werror -pthread -o test test.c
1)不使用參數'argc'。編譯器會發出警告。 2)不使用參數'argv []'。編譯器會發出警告。建議函數'main()'簽名改爲:'int main(void)'。編譯時,始終啓用所有警告,然後修復這些警告。 (對於gcc,至少使用:'-Wall -Wextra -pedantic'(我也使用:'-Wconversion -std = c99') – user3629249
在C中調用'malloc()':1)時,不要強制返回值。它的類型是'void *',可以分配給任何指針。投碼只是使代碼混亂,使其更難以理解,調試和維護。 2)總是檢查(!= NULL)返回的值以確保操作成功。 3)在退出程序之前,將返回的值傳遞給'free()'。在這個簡單的程序中,它不會因爲操作系統的清理而有所作爲,但是在很多程序中,當代碼本身沒有完成清理時,會發生內存泄漏。 – user3629249