unix c学习总结--线程部分(apue)

本文介绍Linux环境下线程编程的基础知识,包括线程的创建、退出、等待、同步等操作,并详细解析了互斥量、读写锁及条件变量的使用。

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

#include<pthread.h>

由于linux下不默认包含pthread库,所以gcc 要多加一个选项编译 -lpthread

pthread_t tid;//声明线程id变量,unsigned long类型

创建线程函数  int prthead_create(pthread_t *restrict tidp,//  tid

                                                           const pthread_atter_t *restrict attr,//线程属性结构体指针,通常为NULL

                                                            void *(*start_rtn)(void *),//线程执行函数指针,形参和返回值为通用类型指针的函数的指针,如果函数声明是不是函数指针要取地址

                                                            // void* start_rtn(void* arg){return ((void*)0);}

                                                            void *restrict arg//  一个通用指针,通常为一个结构体,用来传参到执行函数,通常为NULL                                                           

)    //正确返回0,错误返回errno值

线程退出

任意线程调用exit  _Exit   _exit会直接终止进程,自然终止线程.

主动退出函数(被动有pthraed_cancel,kill,后面有)

void pthread_exit(void *rual_ptr);//因为线程执行函数要求返回一个通用指针类型,可以强制转换,这个函数相当于return或者exit(值);

pthread_exit((void *)2);

pthread_exit((void *)&str);//str是一个结构体变量

当然可以用 return 返回

等待线程返回(等待pthread_exit返回)

在另一个线程中使用

int pthread_join(pthread_t tid,void **rual_ptr);

成功返回0,错误返回errno值

这个函数会使调用线程阻塞,直到得到等待的线程返回或被取消

如果是join分离状态线程会直接返回错误而不阻塞

这里的rual_ptr是一个通用类型指针的指针,可以得到被终止线程的返回状态PTHREAD_CANCELED(需要先分配一个空间),不需要返回状态可以直接为NULL

PTHREAD_CANCELED 的实际值为-1 //#define PTHREAD_CANCELED ((void *) -1) 头文件中的定义

被动退出线程

int pthread_cancel(pthread_t tid)//成功返回0,否则返回errno值

非阻塞函数,只是发出一个请求,当线程达到中断点时可以退出,由于线程本身可以加入处理之类请求的函数,所以请求不一定能成功

清理函数

看名字都知道是以栈的形式在执行

void pthread_cleanip_push(void (*rtn)(void *),//一个形参和返回值为通用类型指针的函数指针,用来安排调用清理函数顺序

void *arg);//传给清理函数的参数

void pthread_cleanup_pop(int excute);//excute为0则不调用释放,否则释放push和pop函数之间的资源

两个函数必须配对使用,不一定要紧挨

分离状态线程

有些线程可以使自己成为分离状态而单独执行,只是为了不能被join,也就是说分离状态线程只是为了不能被其他线程影响而存在

主动使线程成为分离状态线程函数

int pthread_detach(pthread_t tid);//成功返回0,错误返回errno值

线程同步

因为线程是并行运行,所以在操作同一个文件时不一定会得到预期的结果,所以要同步

同步的解决方式 :加锁 所以发明了一个叫 互斥量 的东西

互斥量只有两种状态:上锁,未上锁

pthread_mutex_t f_lock;//定义一个互斥量变量

初始化一个互斥量

int pthread_mutex_init(&f_lock,

const pthread_mutexattr_t *restrict attr)//互斥量的状态量,后面有,通常为NULL表示默认值

int pthread_mutex_destroy(&f_lock);//删除一个互斥量

int pthread_mutex_lock(&f_lock)//上锁

会阻塞直到上锁成功

int pthread_mutex_trylock(&f_lock)//尝试上锁

不阻塞

int pthread_mutex_unlock(&f_lock)//解锁

对一个互斥量产生两次上锁会阻塞至死

在一个结构体中加入一个互斥量,在操作的时候检测互斥量来实现同步.

如果不检测直接操作其他值也可以,只是互斥量没有起到作用


读写锁

pthread_rwlock_t rw_lock;

基本和互斥量函数一样,一一对应

int pthread_rwlock_init(&rw_lock,

const pthread_rwlockattr_t *restrict attr )//锁的属性,NULL为默认值

int pthread_rwlock_rdlock(&rw_lock);//read锁

阻塞

int pthread_rwlock_wrlock(&rw_lock);//write锁

阻塞

int pthread_rwlock_undlock(&rw_lock);//解锁,对两种方式都可以解

非阻塞

int pthread_rwlock_trylock(&rw_lock);

非阻塞

int pthread_wrlock_trylock(&rw_lock);

非阻塞

条件变量

pthread_cond_t con_t=PTHREAD_COND_INITALIZER;//直接定义

pthread_cond_t con_t2;

int pthread_cond_init(&con_t2,

pthread_condattr_t *restrict attr);//条件的状态量结构体指针

int pthread_cond_destory(&con_t2);

未完,后面四个函数还没有理解清楚,暂时总结这么多,下次继续









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值