有人可以解释何时应该使用共享锁。如果我理解正确的话,读取时使用共享锁,写入时使用排他锁。
但是为什么我不能在读取时锁定互斥锁时等待。
有人可以解释何时应该使用共享锁。如果我理解正确的话,读取时使用共享锁,写入时使用排他锁。
但是为什么我不能在读取时锁定互斥锁时等待。
是为了提高性能。多个并发读取就不必按顺序发生,如果结构被频繁读取,这可能是一个很大的好处。(但读取的数据仍然是一致的并且是最新的。)
但是为什么我不能在读取时锁定互斥锁时等待。
通常是为了速度。共享锁允许多个读者,因为内容没有改变。排他锁仅允许单个(通常)写入操作,因为您希望所有写入都是原子的。
更多技术定义来自这里。
排他锁保护对文件资源的更新,包括可恢复的和不可恢复的。它们一次只能由一项交易拥有。如果另一个任务当前拥有针对所请求资源的独占锁或共享锁,则任何需要独占锁的事务都必须等待。共享锁
共享锁支持读完整性。它们确保在只读请求期间记录不在更新过程中。共享锁还可用于防止在读取记录和下一个同步点之间更新记录。
但是为什么我不能在读取时锁定互斥锁时等待。
因为这在某些情况下效率低下,特别是那些很多线程经常读取数据结构,但很少写入且不经常写入的情况。由于如果没有人在写入,多个并发读取是线程安全的,因此对读取器进行互斥将是一种浪费。
想象一个服务器和多个客户端对一些共享数据进行各种事务。如果这些客户端中的大多数只是简单地询问信息,而不是更改任何内容,那么如果服务器一次只允许一个客户端读取,那么它的性能将会很糟糕。
共享锁(也称为读锁)禁止任何其他进程在文件的指定部分请求写锁。但是,其他进程可以请求读锁并继续从资源中读取。
独占锁(也称为写锁)为进程提供了对文件指定部分写入的独占访问权限,并且将阻止任何其他进程获取对该资源的任何类型的锁定,直到该独占锁被释放。
所以读锁说“你现在可以读,但如果你想写,你必须等待”,而写锁说“你必须等待”。
有关官方描述,请查看GNU C 库的官方锁文档。
此外,在许多情况下,共享/独占锁定的上下文是悲观/乐观锁定,这是一种用于处理多用户读/写同一资源的方法。这是方法论的解释。