线程
常用函数
线程库pthread.h是第三方库,需要通过-pthread 或-l pthread在编译时将库链接后使用
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
(*start_routine) (void *), void *arg);
非阻塞,成功返回0,不成功返回错误信息,可以通过strerror转换为字符串值输出
创建的线程ID(或一个结构体)将被保存到thread中,
attr是线程属性,
start_routine是一个函数指针,线程将从这里开始执行,
如果函数需要传参,那么参数放到一个struct中,然后把struct的地址放到arg中
pthread_t pthread_self(void);
获取线程自身的ID
相当于getpid
int pthread_equal(pthread_t t1, pthread_t t2);
void pthread_exit(void *retval);
在哪个线程调用,就终止哪个线程。
传入一个指针,作为返回值,这个值可以在pthread_join获取到
int pthread_join(pthread_t thread, void **retval);
调用这个函数的线程将一直阻塞直到
“thread调用pthread_exit(retval=线程的终止状态)
或自然结束(retval=返回码)
或被取消(返回PTHREAD_CANCELED)”
默认情况下一个线程的资源将一直保持直到这个函数被调用,线程资源被释放
int pthread_detach(pthread_t thread);
分离一个线程,分离的线程被终止时,自动释放资源给系统,无需主线程释放
不能连接已经分离的线程
不能多次分离
相当于waitpid 函数(使用WNOHANG标志时)
int pthread_cancel(pthread_t thread);
会使thread表现为像调用了参数为PTHREAD_CANCELED的pthread_exit,但是这个取消可以被忽略或控制如何被取消
非阻塞,仅仅提出一个请求
线程属性相关
线程属性类型 pthread_attr_t
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
互斥量
互斥量的类型 pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
初始化一个锁,信号量可以
静态分配一个常量:pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
动态分配(malloc),此时必须手动destroy释放信号量
属性可以NULL
int pthread_mutex_destroy(pthread_mutex_t *mutex);
释放内存
int pthread_mutex_lock(pthread_mutex_t *mutex);
加锁,如果当前程序上锁,阻塞直到解锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);
尝试加锁,如果当前被上锁,直接返回EBUSY,不阻塞,未加锁返回0
int pthread_mutex_unlock(pthread_mutex_t *mutex);
读写锁
写锁被加锁,其他所有加锁程序将被阻塞
读锁被加锁,所有读程序可访问,但写程序被阻塞
当读锁被加锁,写锁申请访问时,新加入的读锁将被阻塞,以防读锁长期占用
读写锁的类型 pthread_rwlock_t
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
初始化
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
被创建的锁必须被释放
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
阻塞
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
非阻塞,失败直接返回EBUSY
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);.
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
解锁