unix编程(六)线程

判断线程相同

pthread_equal(pthread_t tid1, pthread_t tid2);


获取自己线程id

pthread_t pthread_self(void)


线程创建

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *resttrict arg);

新建线程ID会被设置tidp指向内存,attr设置线程属性,start_rtn函数的地址,arg函数入参,如果过个参数,使用结构体。创建新线程继承调用线程的信号屏蔽字,挂起信号集会被删除。


线程终止

1.代码返回

2.被其他线程取消

3.调用pthread_exit

void pthread_exit(void *rval_ptr) 结束线程

rval_ptr参数是一个无类型指针,代表线程返回值


int pthread_join(pthread_t thread, void **rval_ptr); 当前线程等待指定线程结束

rval_ptr可以使线程正常代码的return的值,也可以是pthread_exit指定值。


线程可以通过pthread_cancel请求取消其他线程

int pthread_cancel(pthread_t tid);


线程清理处理程序:

void pthread_cleanup_push(void (*rtn)(void *), void *arg);

void pthread_cleanup_pop(int execute);

通过pthread_cleanup_push函数注册线程清理函数,最后一定通过pthread_exit或者由其他线程调用pthread_cancel线程终止才会调用这些清理函数。线程正常终止不会调用这些清理函数的。


线程同步

互斥量

int pthread_mutex_init 初始化

int pthread_mutex_destroy 销毁


int pthread_mutex_lock持锁

int pthread_mutex_trylock 尝试持锁,如果有锁,不阻塞,直接返回

int pthread_mutex_unlock释放锁

int pthread_mutex_timedlock和持锁类似,到时间自动释放锁


避免死锁的方法,所有线程持锁顺序一致


读写锁

就是一个线程写的时候其他线程阻塞,但是没有写线程都是读的话,不会持锁,函数与普通持锁函数类似。

也有带有超时的读写锁。


条件变量

int pthread_cond_init 初始化

int pthread_cond_destory 销毁

int pthread_cond_wait 释放锁,线程等待,直到条件发生改变(等待条件改变的时候,必须已经持锁)

int pthread_cond_timewait 和上面类似,只是有一个超时不等待了

int pthread_cond_signal 发送条件改变的信号,至少唤醒一个

int pthread_cond_broadcast 唤醒所有等待该条件的线程


屏障

允许每个线程等待,直到所有的合作线程都达到某一个点,然后继续执行

int pthread_barrier_init 这里有一个count参数,代表总共要等待多少线程

int pthread_barrier_destory

int pthread_barrier_wait 等待一个线程(睡眠),直到所有线程等待满足数量count,所有的线程才会被唤醒




你可能感兴趣的:(unix编程(六)线程)