java实现线程互斥的方式_C语言描述线程间的同步与互斥

一、实现线程间同步互斥的操作

1、线程间同步 ==== 有序执行法1、多个信号量  法2、条件变量+互斥锁 ===>broadcast signal

2、线程间互斥 ==== "你死我活"法1、单个信号量  法2、互斥锁

//1、互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。//2、同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。//3、同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。//4、互斥是一种特殊的同步。

二、为什么要实现同步互斥

保护临界资源

即全局变量

pthread_create之前的成为 全局资源 =====>当有线程操作全局资源的时候 ===>变为临界资源

三、代码示例

1、多个线程实现同步,定义多个信号量

dd2a4583ec1ea464f00a1933309be5a2.png

f43ed6635143049eef80286d9e78270d.png

99dcf0eedeb5eb5cfe32612676be4303.png

同步是在互斥的基础上实现有序。

2、互斥锁实现线程互斥

同步是在互斥的基础上实现有序。

f45ce7a20f0344960e15a602d1537e7d.png

40e76b28fbe7d9f910c2950b6e296f6a.png

8ec1e77e8009536cf0351c1a54b38c9a.png

互斥是一种特殊的同步

3、互斥锁 + 条件变量 实现同步互斥

1)mutex + pthread_cond + pthread_cond_broadcast

//pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。//pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。//当其他线程通过pthread_cond_signal()或pthread_cond_broadcast,把该线程唤醒,使pthread_cond_wait()通过(返回)时,该线程又自动获得该mutex。

bfdd9f88ff0883630836590e71b56095.png

3e821b1f2494a4a99499d62a1fc726e3.png

e854ebfc8ec3673cf8c50e6a0ae385f9.png

d112056bbf1b6b2a114aceaca76b1fb9.png

当有多个线程时,使用pthread_cond_broadcast会唤醒所有阻塞的线程,因此不能高效保证其同步性。

2)mutex + pthread_cond + pthread_cond_signal

//pthread_cond_signal函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状,继续执行//.如果没有线程处在阻塞等待状,pthread_cond_signal也会成功返回。//pthread_cond_signal只给一个线程发信号。//假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。//如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。

0565c9308fecef4bac4ce086cc644d14.png

a108b45d74239bd150c3cea26ee36376.png

5f6a3b728091cb75079b2583749cd92d.png

先将pthread_cond_signal注释掉,看看会有什么现象

446bbc1307d8985f03e3ca7c47a9b244.png

6e17ceed2d6fbb63fb8d204614cbb3dc.png

两个线程都发送阻塞进入了睡眠,

疑问:创建线程时,线程运行进入阻塞,为什么代码能接着运行,而不是阻塞在阻塞处,不像下执行。

原因:在线程进入阻塞后,会自动释放CPU控制权,进入阻塞。只有当中断发生时,才会使线程从阻塞中跳出,即pthread_cond_signal唤醒阻塞线程

使用pthread_cond_signal唤醒指定的条件阻塞线程

8c01b27c5d9847ac081a85fad3fcfcde.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值