pthread.h
thread(线程)
int pthread_create(pthread_t *__newthrad, pthread_attr_t *_attr, void *(*__start_routing) (void *), void *__arg);
创建线程, 线程属性设置为__attr, 线程的调度方法为void * funname(void *)形式的, 调度方法的参数传递为__arg。
函数返回0则表明线程创建成功,否则表明线程创建失败。
默认创建的thread是joinable(可结合的,其可以需要其他线程调用pthread_join,才能完整的回收资源,并且该线程可以被其他线程终止)
而thread的另一个类型是detach(分离的,其不能被其他线程终止,其资源会在该线程终止的时候,自动被系统回收)
int pthread_join(pthread_t __th, void **__thread_return);
等待线程__th退出,如果线程退出的时候会将非NULL返回结果存储到__thread_return(不过要记得线程返回的变量值,不能是该函数内部变量)里面去。
如果线程本身的类型是detach的,那么该会马上返回EINVAL(invalid value,非法参数),表明该线程不能使用join,则表明该线程是detach分离的
thread设置为detach的两种方式:
1.创建的时候设置__attr为detach,即可
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&th, &attr, fun, NULL);
2.在创建方法后设置
pthread_t th;
pthread_create(&th, NULL, fun, NULL);
pthread_detach(th);
或者
void *fun(void *obj) {
pthread_detach(pthread_self());
do_something...
}
将thread设置为detach(分离类型)的一个典型应用场景.
web server,再创建工作线程的时候,其创建工作线程后,不应调用pthread_join等待线程完成,而是将工作线程设置为detach,交由系统自动回收工作线程资源。
mutex(互斥锁)
int pthread_mutex_init(pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr);
对互斥锁进行初始化,例子:可以对互斥锁设置为递归锁(重入锁),默认互斥锁是不能重入的。
int pthread_mutex_lock(pthread_mutex_t *__mutex)
当前线程获取锁,获取成功获取到锁,则可以往后进行代码执行,否则会一直阻塞线程。
int pthread_mutex_trylock(pthread_mutex_t *__mutex)
当前线程尝试获取锁,该操作会马上返回。如果成功获取到锁,返回值为0,否则获取锁失败,则应该进行没有获取到锁的相关操作,而避免对于需要加锁部分继续执行。
int pthread_mutex_timedlock(pthread_mutex_t *__mutex, const struct timespec *__abstime);
当前线程获取锁,最长愿意阻塞时间到timespec所设置的时间节点(timespec其是对于具体时间戳的时间设置), 当成功获取到锁后,返回值为0,否则表明没有成功获取到锁。
如果没有获取到锁,应该执行没有获取到锁的相关操作,而避免对于需要加锁部分继续执行。
int pthread_mutex_unlock(pthread_mutex_t *__mutex);
当前线程释放锁操作,如果之前线程已经成功获取到__mutex锁,那么该操作时解锁,这样其他线程就可以对该锁进行获取操作
int pthread_mutex_destroy(pthread_mutex_t *__mutex);
销毁锁相关资源
cond(条件变量)
int pthread_cond_init(pthread_cond_t *__cond, const pthread_condattr_t *__cond_attr);
初始化条件变量,一般__cond_attr为NULL
int pthread_cond_wait(pthread_cond_t *__cond, pthread_mutex_t *__mutex);
在已经获取到锁__mutex的情况下,等待条件变量__cond,原子释放锁__mutex和进行等待队列中,等待pthread_cond_singal或者pthread_cond_broadcast的唤醒操作。
int pthread_cond_timedwait(pthread_cond_t *__cond, const struct time spec *__abstime);
在已经获取到锁__mutex的情况下,最长等待条件变量__cond,等待时间为__abstime所设置的具体时间戳,原子释放锁__mutex和进行等待队列中,等待ptherad_cond_signal或者pthread_cond_broadcast的唤醒操作。
int pthread_cond_singal(pthread_cond_t *__cond);
唤醒其中一个线程,其是在等待该__cond条件变量的。
int pthread_cond_broadcast(pthread_cond_t *cond);
唤醒所有等待__cond条件变量的线程。
int pthread_cond_destroy(pthread_cond_t *cond);
释放条件变量相关资源。
rwlock(读写锁-读写锁没有和条件变量cond的配合使用)
int pthread_rwlock_init(pthread_rwlock_t *__rwlock, const pthread_rwlockattr_t *__attr);
读写锁初始化,一般使用__attr为NULL初始化即可
int pthread_rwlock_rdlock(pthread_rwlock_t *__rwlock);
获取读锁,如果当前没有写锁被使用,那么多个线程进行读锁获取不会发生竞争关系,否则会阻塞等待写锁的释放。
int pthread_rwlock_tryrdlock(pthread_rwlock_t *__rwlock);
尝试获取读锁,立即返回不会阻塞,如果可以获取到读锁则结果为0,否则返回错误码
int pthread_rwlock_timedrdlock(pthread_rwlock_t *__rwlock, const struct timespec *__abstime);
获取读锁,最长等待时间为__abstime所设置的具体时间戳,如果在时间戳内能够获取到读锁则结果为0,否则返回错误码(一般为110,超时)
int pthread_rwlock_wrlock(pthread_rwlock_t *__rwlock);
获取写锁,如果当前没有读锁或者写锁被使用,则会获取到写锁,否则会阻塞等待直到写锁能够被获取到。
int pthread_rwlock_trywrlock(pthread_rwlock_t *__rwlock);
尝试获取写锁,立即返回不会阻塞,如果可以获取到写锁则结果为0,否则返回错误码
int pthread_rwlock_timedwrlock(pthread_rwlock_t *__rwlock, const struct timespec *__abstime);
获取写锁,最长等待时间为__abstime所设置的具体时间戳,如果在时间戳内能够获取到写锁则结果为0,否则返回错误码(一般为100,超时)
int pthread_rwlock_destory(pthread_rwlock_t *__rwlock);
释放读写锁的相关资源