c posix thread mutex cond rwlock

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);

释放读写锁的相关资源



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值