线程控制(三)

线程同步

互斥锁

*互斥锁通过锁机制来实现线程间的同步.在同一时刻它通常只允许一个线程执行一个关键部分的代码.
     
         互斥锁函数
这里写图片描述

*使用互斥锁前,必须先进行初始化操作.初始化有两种方式:
 >1.静态赋值法,将宏结构常量PTHREAD_MUTEX_INITIALIZER赋给互斥锁,操作语句为:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

 >2.通过pthread_mutex_init函数初始化互斥锁,该函数原型为

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);

*函数中的参数mutexattr表示互斥锁的属性,如果为NULL则使用默认属性.

*初始化以后,就可以给互斥锁加锁.

加锁

>phread_mutex_lock()
 函数原型:

int pthread_mutex_lock(pthread_mutex_t *mutex);

>pthread_mutex_trylock()
函数原型:

int pthread_mutex_trylock(pthread_mutex_t *mutex);

*用phread_mutex_lock()加锁时,如果mutex已被锁住,当前尝试加锁的线程就会阻塞,直到互斥锁被其他线程释放.当phread_mutex_lock()函数返回时,说明互斥锁已经被当前线程成功加锁.

*pthread_mutex_trylock()函数加锁时,如果mutex已经被加锁,它将立即返回,返回的错误码是EBUSY,而不是阻塞等待.

加锁时,不论哪种类型的锁,都不可能被两个不同的线程同时得到,其中一个必须等待解锁,在同一进程中的线程,如果加锁后没有解锁,则其他线程将无法再获得该锁.

解锁

pthread_mutex_unlock()
*函数原型:

int pthread_mutex_unlock(pthread_mutex_t *mutex);

*用pthread_mutex_unlock()函数解锁时,要满足:
>1.互斥锁必须处于加锁状态
>2.调用本函数的线程必须是给互斥锁加锁的线程.

*解锁后如果有其他线程在等待互斥锁,等待队列中的第一个线程将获得互斥锁.

当一个互斥锁使用完毕后,必须进行清除.

清除互斥锁

pthread_mutex_destroy()
*函数原型:

int pthread_mutex_destroy(pthread_mutex_t *mutex);

*清除一个互斥锁要求当前处于开放状态,若锁处于锁定状态,函数返回EBUSY,该函数成功执行时返回0.

条件变量

  *条件变量是利用线程间共享的全局变量进行同步的一种机制.条件变量宏观上类似if语句符合条件就能执行某段程序,否则只能等待条件成立.
   
        操作条件变量的函数

这里写图片描述

条件变量的初始化
 >1.静态赋值法:将宏结构常量PTHREAD_COND_INITIALIZER赋予互斥锁.操作语句如下:

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

>2.使用函数pthread_cond_init函数原型为:

int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
等待条件成立

>1.pthread_cond_wait
*函数原型:

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

>2.pthread_cond_timedwait
*函数原型:

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
激活等待线程

>1.pthread_cond_signal
*函数原型:

int pthread_cond_signal(pthread_cond_t *cond);

>2.pthread_cond_broadcast
*函数原型:

int pthread_cond_broadcast(pthread_cond_t  *cond); 

*区别:
 pthread_cond_signal()激活一个等待条件成立的过程,存在多个等待线程时,按入队顺序激活其中一个,而pthread_cond_broadcast()则激活所有等待进程.

清除条件变量

*pthread_cond_destroy()
*函数原型:

int pthread_cond_destory(pthread_cond_t *cond);

*注意:
pthread_cond_destroy函数清除由cond指向的条件变量.只有在没有线程等待该条件变量的时候才能清除这个条件变量,否则返回EBUSY.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值