互斥琐
定义:指代相互排斥,最基本的同步形式。用于保护临界区,以保证任何时刻只有一个线程或一个进程在执行其中的代码。
上锁: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标识的。