线程的同步

线程最大的特点就是资源的共享性,然而资源共享中的同步问题是多线程编程的难点。linux提供了多种方式处理线程间的同步问题,其中最常见就有互斥锁、条件变量和异步信号。

互斥锁

1)互斥锁通过锁机制来实现线程间的同步。在同一时刻通常只允许一个线程执行一个关键部分代码。

pthread_mutex_init——初始化一个互斥锁
pthread_mutex_destroy——注销一个互斥锁
pthread_mutex_lock——加锁,如果不成功,阻塞等待
pthread_mutex_unlock——解锁
pthread_mutex_trylock——测试加锁,如果不成功就立即返回,错误码为EBUSY

2)互斥锁的初始化有两种方法:一种是静态赋值法,将宏结构常量PTHREAD_MUTEX_INITIALIZER赋给互斥锁,另一种方法是通过pthread_mutex_init函数初始化互斥锁。

注意:加锁时,无论哪种类型的锁,都不可能被两个不同的线程同时得到,其中一个必须等待解锁,在同一个进程中的线程,如果加锁后没有解锁,则对于其他的线程就无法获得该锁。用pthread_mutex_unlock函数解锁时,要满足两个条件:一个是互斥锁必须处于加锁状态,二是调用本函数的线程必须是给互斥锁加锁的线程。当一个互斥锁使用完毕后,必须进行清除。

条件变量

条件变量给多个线程提供了一个会和的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定条件的发生。(条件变量本身是有互斥量保护的)

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

使用条件变量主要包括两个动作:一个等待使用资源的线程等待“条件变量被设置为真”;另一个线程在使用完资源后“设置条件为真”,这样就可以保证线程间的同步了。要保证条件变量被正确修改,条件变量就要收到特殊的保护,在其中互斥锁扮演着重要的角色。

pthread_cond_init——初始化条件变量
pthread_cond_wait——基于条件变量阻塞,无条件等待
pthread_cond_timewait——阻塞直到指定事件发生,计时等待
pthread_cond_signal——激活阻塞的锁
pthread_cond_broadcast——解除所有线程的阻塞
pthread_cond_destroy——清除条件变量

与互斥锁相同,条件变量的初始化也有两中方式,一种是静态赋值法,将宏常量PTHREAD_COND_INITIALIZER赋予条件变量,另一种是使用pthread_cond_init

线程被条件变量阻塞后,可以通过函数pthread_cond_signalpthread_cond_broadcast激活,前者激活一个条件等待成立的线程,存在多个等待线程时,按入队顺序激活其中一个;而后者则激活所有等待线程。

一个条件变量不再使用时,需要将其清除。注意:只有在没有线程等待该条件变量的时候在能清除这个条件变量。

异步信号

信号与任何线程都是异步的,也就是说信号到达线程的是时间是不定的。如果有多个线程可以接收异步信号,则有一个被选中。如果并发的多个同样的信号被送到一个进程,每一个将被不同的线程处理。如果所有的线程都屏蔽该信号,则该信号将被挂起,直到信号解除屏蔽来处理它们。

函数pthread_kill用来向特定的线程发送信号,函数pthread_sigmask用来设置线程的信号屏蔽码,函数sigwait用来阻塞线程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值