pthread_rwlock_t 未定义的问题

本文探讨了在Linux环境下使用gcc编译时遇到pthread_rwlock_t未定义的问题,并详细解释了这是由于指定了-std=c99参数导致忽略了GNU扩展部分的原因。文章提供了两种解决方案:移除-std=c99参数或改为使用GNU标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在linux上次编译时出现pthread_rwlock_t没有定义的现象.但是已经include了pthread.h,网上查了一些资料后发现,原因竟然是因为显示使用了-std=c99参数导致.

 

在c99没有完全实现时,如果不显示指定-std, 则gcc默认使用gnu89(或gnu90)标准.

一般而言,

               gnuXX标准 = cXX标准 + GNU extension

 

而pthread_rwlock_t正好就是GNU extension的一部分. 所以指定使用c99就会把GNU extension禁用,造成pthread_rwlock_t未定义的问题.

 

解决方法就是:

方法一: 把-std=c99去掉,

方法二: 或者改成-std=gnu89, -std=gnu90, -std=gnu99 这类

 

 

 

          

#include <stdio.h> #include <pthread.h> #include <unistd.h> //临界资源,应该使用volatile进行修饰,防止编译器对该变量进行优化 volatile int data = 10; //读写锁对象,必须是全局变量 pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; //子线程B的任务,格式是固定的 void * task_B(void *arg) { //线程任务应该是死循环,并且不会退出 while(1) { //获取读操作的锁 pthread_rwlock_rdlock(&rwlock); //对临界资源进行读操作 printf("I am Thread_B,data = %d\n",data); sleep(1); //释放读操作的锁 pthread_rwlock_unlock(&rwlock); } } //子线程C的任务,格式是固定的 void * task_C(void *arg) { //线程任务应该是死循环,并且不会退出 while(1) { //获取读操作的锁 pthread_rwlock_rdlock(&rwlock); //对临界资源进行读操作 printf("I am Thread_C,data = %d\n",data); sleep(1); //释放读操作的锁 pthread_rwlock_unlock(&rwlock); } } //主线程 A int main(int argc, char const *argv[]) { //1.对创建的读写锁对象进行初始化 pthread_rwlock_init(&rwlock,NULL); //2.创建子线程 pthread_t thread_B; pthread_t thread_C; pthread_create(&thread_B,NULL,task_B,NULL); pthread_create(&thread_C,NULL,task_C,NULL); //3.进入死循环,主线程需要对临界资源进行修改 while(1) { //主线程会阻塞等待,10s会解除阻塞 sleep(10); //获取写操作的锁 pthread_rwlock_wrlock(&rwlock); //对临界资源进行读操作 data += 20; printf("I am main_Thread,data = %d\n",data); sleep(5); //释放写操作的锁 pthread_rwlock_unlock(&rwlock); } return 0; }
最新发布
07-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值