您的位置:首页 > 运维架构 > Linux

互斥锁和条件变量

2016-07-05 08:31 246 查看
互斥琐

定义:指代相互排斥,最基本的同步形式。用于保护临界区,以保证任何时刻只有一个线程或一个进程在执行其中的代码。

上锁:pthread_mutex_lock()

          临界区

解锁:pthread_mutex_unlock();

条件变量

定义:用于等待信号,同步的另一种手段。每一个条件变量总有一个互斥琐与之关联。

等待函数:pthread_cond_wait();

信号发送函数:pthread_cond_signal();

生产者和消费者的问题:生产者向buf添加数据,添加到 m 个,消费者读数据,读到 i 个;

1.如果只用互斥琐解决,消费者读的每一个i  数据,都必须先上锁 m ,然后查询 i < m ? 然后解锁,如果不小于,则接着上锁——查询——解锁,需要轮询,这将非常消耗CPU。

2.互斥琐+条件变量完美解决这个问题:互斥琐用于上锁,条件变量用于等待,生产者流程 上锁——生产数据——解锁,上锁——改变条件,发信号——解锁。(条件用来通知消费者数据准备好,为避免上锁冲突,需要先改变条件再发信号)。消费者流程 上锁——等待条件,改变条件——解锁。

附加:
读写锁

同步一些线程共享的一个或多个数据的访问或更新。

属性:只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。

           仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于写。

相关函数:pthread_rwlock_rdlock();//获取一个读出锁;

                  pthread_rwlock_wrlock();//获取一个写入锁;

                  pthread_rwlock_unlock();//释放一个读出锁或写入锁;

记录上锁:读写锁的一种扩展类型,可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读和写。被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl.这种锁通常在内核中维护,属主是由属主的进程ID标识的。

               
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  互斥琐 linux 线程