如果有实时场景举例解释每个问题将会很有帮助。 除了pthread中的这些方法,是否还有其他处理同步的方式? 互斥锁与递归锁有什么不同(任何实时场景)?
如果有实时场景举例解释每个问题将会很有帮助。 除了pthread中的这些方法,是否还有其他处理同步的方式? 互斥锁与递归锁有什么不同(任何实时场景)?
互斥锁可用于保护共享资源(变量、文件、外围设备)免受可能导致其处于不一致状态的修改。
信号量可以用于管理有限数量的相同共享资源(重要案例之一是IPC队列)。线程可以从池中获取资源,将资源放回池中,或等待直到有资源可用。请注意,您可能仍需要使用互斥锁以及信号量(以保护池数据结构本身)。
读写锁可用于保护可读或可写(修改)的共享资源。所有读取线程可以同时访问它。写入线程需要独占访问。
条件变量可与互斥锁一起使用,以发出事件信号。
维基百科 可用于了解大部分相关信息。
这在boost::interprocess
文档中有明确的解释。
什么是互斥锁?
互斥锁是进程间最基本的同步形式,用于互斥访问共享资源。互斥锁保证只有一个线程可以锁定给定的互斥锁。如果一个代码区域被互斥锁锁定和解锁,那么保证只有一个线程执行该代码区域。当该线程解锁互斥锁时,其他线程可以进入该代码区域:
//互斥锁已经被构造
lock_the_mutex();
//这段代码将只由一个线程执行
unlock_the_mutex(); 互斥锁也可以是递归或非递归的:
递归互斥锁可以被同一线程多次锁定。为了完全解锁互斥锁,线程必须解锁相同次数的互斥锁。非递归互斥锁不能被同一线程多次锁定。如果一个线程两次锁定一个互斥锁,则结果是未定义的,可能会抛出错误,也可能会永久阻塞线程。
boost interprocess docs
以及
什么是信号量?
信号量是一种基于内部计数的进程间同步机制,提供两个基本操作:
等待:测试信号量计数的值,如果该值小于或等于0,则等待。否则,减少信号量计数。发布:增加信号量计数。如果有任何进程被阻塞,则唤醒其中一个进程。如果初始信号量计数初始化为1,则等待操作相当于互斥锁定,发布操作相当于互斥解锁。这种类型的信号量称为二进制信号量。
虽然信号量可以像互斥锁一样使用,但它们具有独特的特点:与互斥锁不同,发布操作不必由执行等待操作的同一线程/进程执行。
boost::interprocess文档
boost interprocess
没有明确的读写锁,但是使用shared_locks
、upgrade_lock
和upgrade_to_unique lock
实现了它们。
C++本身还没有支持读写锁(使用共享互斥体),但@Howard Hinnet曾经试图将其加入其中,如果您在这里查看,他还提供了代码。
C ++没有信号量,而且据我所知,互斥锁仅在新的C ++11标准中存在,这就是为什么大多数内容都涉及到boost :: interprocess
的原因。