1. 程式人生 > >gcc/clang編譯帶pthread.h頭文件的源碼時需要的參數

gcc/clang編譯帶pthread.h頭文件的源碼時需要的參數

規則 小程序 訪問 技術分享 ges 增加 文件 警告 include

今天敲了一個小程序,編譯時出現錯誤:undefined reference pthread_create

原來由於pthread庫不是Linux系統默認的庫,連接時需要使用庫libpthread.a,所以在使用pthread_create創建線程時,在編譯中要加-lpthread參數:
gcc -o test -lpthread test.c

再查發現編譯時參數寫成 -pthread 也是可以的。

 * 經反復調試,此代碼在多核環境下不安全,可能出現多個線程同時訪問共享變量,
* 即線程a將count讀入操作,還未寫回時刻,線程b也對count進行操作,則先完成
* 操作的線程操作無效。
* 後來發現,原來此不安全是因為,我寫的函數是不可重入函數。 *

#include <stdio.h> #include <pthread.h> #include <stdlib.h> #define NUMBER_OF_THREADS 10 int static count = 0; void *print_hello_world(void *tid) { pthread_yield(NULL); printf ("Hello world. Greetings from thread %lu\t%d\n
",pthread_self(),(int)tid); //long可以轉換成int類型 count++; pthread_exit(NULL); } int main(int argc, char **argv) { pthread_t threads[NUMBER_OF_THREADS]; int status, i; for(i = 0; i < NUMBER_OF_THREADS; i++) { printf ("Main here. Creating thread %d\n
",i); status = pthread_create(&threads[i], NULL, print_hello_world,(void*)(long)i); //64位機子 int轉指針類型會告警,故先轉為long(64位)與指針位數相等 if(status != 0) { printf ("Oops. pthread_create returned error code %d\n",status); exit(-1); } } for(i = 0; i < NUMBER_OF_THREADS; i++) { pthread_join(threads[i], NULL); printf ("Thread %d ended!\n",i); } printf ("count=%d\n",count); return 0; }

技術分享

xcode 中出現 Implicit declaration of function ‘xxxx‘ is invalid in C99” 警告的解決辦法

該警告明確告訴我們在C99的規範中,不允許出現隱含聲明的用法。這是C99規範中增加的規則,不過即便不遵守此規則,也僅僅是一個警告而已。


什麽是隱含聲明呢,也很簡單,就是你調用函數的c文件中,沒有正確包含對應的頭文件。一般來說,c,c++都會將類,函數,的聲明放在頭文件中,這樣在需要的時候包含對應頭文件就可以了,在編譯器的前期處理中,需要通過頭文件來建立一些函數,變量,類的表,如果調用到了聲明中沒有的函數,編譯器會認為是有危險的,顯而易見,如果直接調用函數,在運行期間會出現程序異常。


因此強烈建議大家不要忽略這個警告,更不要象個別文章建議的那樣把編譯環境配置成C89,這樣隱患依然存在。


看來在解決這些警告之前,還是多了解一下C89, C99這些語言標準比較好。

gcc/clang編譯帶pthread.h頭文件的源碼時需要的參數