Linux线程间同步

前言

  • 一般的增量操作流程如下:
    1、从内存读取寄存器。
    2、在寄存器对变量进行增量操作。
    3、把新的值写到内存单元。
  • 如果两个线程在同一时间,对同一变量做增量操作,而不进行同步的话,结果可能会出现不一致,可能会增加1,也可能会增加2。
  • 如果是原子操作就不存在上述的竞争,数据总是顺序一致出现。

锁(互斥量)

  • pthread互斥量mutex可以在访问共享资源前对互斥量加锁,访问完之后释放互斥量。对互斥量加锁之后,任何其他试图再次对互斥量加锁的线程都会被阻塞,只到当前的线程释放互斥锁。
  • 只有所有的线程设计都遵守相同的数据访问规则,互斥量机制才能够正常的运行。
  • 加锁的对象语句在pthread_mutex_lock和pthread_mutex_unlock函数之间。

避免死锁

产生死锁的可能有:

  • 线程试图对同一个互斥量加锁两次,那么自身就会陷入死锁的状态。
  • 当两个线程都在请求对方线程资源的时候,并且各自锁柱了对方的互斥量,导致两个线程都不发前行,于是就产生了死锁。

解死锁:

  • 可以通过仔细控制互斥量加锁的顺序来避免死锁的发生。比如:要对两个互斥量A和B加锁,所有的线程都是在锁住B之前,来锁住A,就不会发生死锁。因为可能出现死锁只会发生在一个线程试图锁住另一个线程以相反方向锁住的互斥量。
  • 可以先释放已经占有的锁,然后过一段时间再试试。这种情况可以使用pthread_mutex_trylock接口避免死锁。如果pthread_try_lock返回成功,那就可以前进。反之,可以先释放已经占有的锁,然后过段时间再试试。

读写锁

  • 读写锁与互斥量类似,不过允许更高的并行性能。
  • 不同于正常锁只有加锁和不加锁,读写锁有三种模式:读模式加锁、写模式加锁、不加锁。
  • 一次只有一个线程可以占有写模式的读写锁,可以有多个线程占有读写锁的读模式。
  • 读写锁非常适合对数据读的次数远大于写的情况,当线程先获得读模式下的读写锁,该锁保护的数据就可以被多个获得读模式的线程读取。

条件变量

  • 条件变量是线程的另一种同步机制,条件变量与互斥锁一起使用允许线程以无竞争的方式等待特定条件的发生。
  • 通过pthread_cond_t数据类型保存条件变量,通过pthread_cond_wait函数对锁的状态进行判定。

自旋锁

  • 与互斥量类似,但是不是通过休眠使得进程阻塞的,而是通过一直处于忙等状态,进行阻塞。
  • 使用于锁被持有很短的时间,线程不希望在调度上花费过多的成本。

屏障

  • 是用户协调多个线程并行工作的机制,允许每一个线程的等待,直到所有的合作线程都达到了某一个点,然后继续执行。比如:pthread_join函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值