gcc/clang编译带pthread.h头文件的源码时需要的参数

Posted 李学文

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc/clang编译带pthread.h头文件的源码时需要的参数相关的知识,希望对你有一定的参考价值。

今天敲了一个小程序,编译时出现错误: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头文件的源码时需要的参数的主要内容,如果未能解决你的问题,请参考以下文章

gcc编译线程程序,为啥要加-lpthread,头文件已经包含了<pthread.h>了啊

pthread.h不属于linux内核,但是为啥很多内核源码中include了pthread.h

pthread.h 头文件问题

调用库<semaphore.h>时,VS报错无法解析的外部符号 __imp__pthread_create

调用库<semaphore.h>时,VS报错无法解析的外部符号 __imp__pthread_create

pthread.h 的 undefined reference to `pthread_create'