use*_*350 7 mutex semaphore readerwriterlock
任何解释每个的实时场景都将受到赞赏.除了pthreads之外还有其他方法来处理同步.互斥体与递归互斥体(任何实时场景)有何不同?
互斥锁可用于保护共享资源(变量,文件,外围设备)免受可能使其处于不一致状态的修改.
信号量可用于管理相同共享资源的有限池(其中一个重要情况是IPC队列).线程可以从池中获取资源,将一个资源放入池中,或者等待一个资源可用.请注意,除了信号量之外,您可能仍需要使用互斥锁(以保护池数据结构本身).
读写锁可用于保护可以读取或写入(修改)的共享资源.所有读者线程都可以同时访问它.作者线程需要独占访问权限.
条件变量可以与互斥锁一起用于发信号事件.
维基百科可用于阅读大部分内容.
这在boost::interprocess文档中得到了非常简单的回答
什么是互斥体?
互斥代表互斥,它是进程之间最基本的同步形式。互斥体保证只有一个线程可以锁定给定的互斥体。如果代码段被互斥锁定和解锁包围,则可以保证一次只有一个线程执行该代码段。当该线程解锁互斥体时,其他线程可以进入该代码区域:
//互斥体之前已经构造好了
lock_the_mutex();
//此代码一次只能由一个线程执行。
解锁互斥体();互斥锁也可以是递归的或非递归的:
递归互斥锁可以被同一线程多次锁定。要完全解锁互斥体,线程必须在锁定互斥体的同时解锁该互斥体。非递归互斥锁不能被同一线程多次锁定。如果一个互斥锁被一个线程锁定两次,结果是不确定的,它可能会抛出错误或者线程可能会被永远阻塞。boost 进程间文档
和
什么是信号量?
信号量是基于内部计数的进程之间的同步机制,提供两种基本操作:
等待:测试信号量计数的值,如果该值小于或等于 0,则等待。否则,减少信号量计数。Post:增加信号量计数。如果任何进程被阻塞,则其中一个进程将被唤醒。如果初始信号量计数初始化为1,则Wait操作相当于互斥锁,Post相当于互斥锁解锁。这种类型的信号量称为二进制信号量。
虽然信号量可以像互斥体一样使用,但它们有一个独特的功能:与互斥体不同,Post 操作不需要由执行 Wait 操作的同一线程/进程执行。 boost::进程间文档
boost interprocess 没有明确地具有称为读写锁的东西,但是它确实使用shared_locks, 和 aupgrade_lock来实现它们upgrade_to_unique lock
什么是可共享和可升级互斥体?
可共享和可升级互斥体是特殊的互斥体类型,比普通互斥体提供更多锁定可能性。有时,我们可以区分读取数据和修改数据。如果只有一些线程需要修改数据,并且使用普通互斥体来保护数据不被并发访问,则并发性非常有限:两个仅读取数据的线程将被序列化而不是并发执行。
如果我们允许对仅读取数据的线程进行并发访问,但避免读取和修改的线程之间或修改的线程之间的并发访问,则可以提高性能。在数据读取比数据修改更常见并且同步数据读取代码需要一些时间来执行的应用程序中尤其如此。通过可共享互斥锁,我们可以获得两种锁类型:
独占锁:类似于普通的互斥锁。如果一个线程获取了排它锁,则在释放排它锁之前,其他线程都无法获取任何锁(排它锁或其他锁)。如果任何其他线程拥有除独占锁之外的任何锁,则尝试获取独占锁的线程将被阻塞。该锁将由修改数据的线程获取。共享锁:如果一个线程获取了共享锁,其他线程就无法获取排它锁。如果任何线程已获取独占锁,则尝试获取可共享锁的线程将被阻塞。这种锁定是由只需要读取数据的线程执行的。通过可升级互斥锁,我们可以获得以前的锁以及新的可升级锁:
可升级锁:获取可升级锁类似于获取特权共享锁。如果一个线程获取了可升级锁,其他线程就可以获取可共享锁。如果任何线程已获取独占锁或可升级锁,则尝试获取可升级锁的线程将被阻塞。当已获取可升级锁的其他线程释放该锁时,保证能够以原子方式获取独占锁。这用于可能需要修改数据但通常只需要读取数据的线程。该线程获取可升级锁,其他线程可以获取可共享锁。如果可升级线程读取数据并且必须对其进行修改,则可以将该线程提升为获取排它锁:当所有可共享线程都释放了可共享锁时,可升级锁会自动提升为排它锁。新提升的线程可以修改数据,并且可以确保在进行转换时没有其他线程修改过它。只有 1 个线程可以获取可升级(特权读取器)锁。 boost 进程间文档
C++ 本身还没有reader-writer locks(使用共享互斥体),但 @Howard Hinnet 确实尝试将它们放入其中,如果你看这里,他还提供了代码
据我所知,C++ 没有信号量,而互斥体仅出现在新的 C++11 标准中,这就是为什么大部分内容都是关于boost::interprocess
| 归档时间: |
|
| 查看次数: |
7309 次 |
| 最近记录: |