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