线程也有线程ID用pthread_t 表示
每个系统对pthread_t 的定义不同。
int pthread_equal(pthread_t tid1, pthread_ttid2)
获得线程的线程ID
pthread_t pthread_self()
创建线程
int pthread_create(pthread_t *tid, const pthread_atrr_t*attr, void* (*start_rtn)(void*). void* arg);
每个线程都有自己的栈空间和errno变量
线程可以有三种方式退出
1 线程只是从启动例程返回,返回值是退出码
2 线程可以被同一个进程的其他线程取消
3 线程调用phread_exit();
void pthread_exit(void * reval); int pthread_join(pthread_t thread, void**reval);
调用线程将一直阻塞可知道指定的线程返回。
取消线程
线程可以调用pthread_cancel(pthread_t tid);
int pthread_cancel(pthread_t tid);
线程清理函数
void pthread_cleanup_push(void(*rtn)(void*), void* arg); void pthread_pop(int execute);
什么时候调用这些清理函数
1 线程调用pthread_exit
2 响应取消请求的时候
3 用非零execute参数调用pthread_cleanup_pop的时候
使线程分离,这样就不用调用phread_join去获取线程的状态了,让操作系统来回收线程的资源。
int pthread_detach(pthread_t tid);
还可以phread_create的时候对传入的属性,设置为分离状态
线程同步:
互斥量:
初始化和destroy
int pthread_mutex_init(pthread_mutex_t*mutex, const pthread+_mutexattr_t *attr) int pthread_mutex_destroy(phtread_mutex_t*mutex);
加锁和解锁
int pthread_mutex_lock(pthread_mutex_t*mutex); int pthread_mutex_trylock(pthread_mutex_t*mutex); int pthread_mutex_unlock(pthread_mutex_t*mutex);
读写锁:
初始化和destroy
int pthread_rwlock_init(pthread_rwlock_t*rwlock, const pthread_rwlockattr_t * attr); int pthread_rwlock_destroy(pthread_rwlock_t*rwlock);
加锁和解锁
int pthread_rwlock_rdlock(pthread_rwlock_t*rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock); int pthread_rwlock_unlock(pthread_rwlock_t* rwlock); intpthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock); intpthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
条件变量:
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *attr); int pthread_cond_destroy(pthread_cond_t *cond); int pthread_cond_wait(pthread_cond_t *cond, phtread_mutex_t *mutex); int pthread_cond_signal(phtread_cond_t*cond)//发送信号 int pthread_cond_broadcast(pthread_cond_t*cond)