我什么时候应该使用共享锁定(读锁定)

时间:2012-08-31 08:24:50

标签: multithreading thread-safety locking mutex

有人可以解释何时应该使用共享锁。如果我理解正确,则在读取时使用共享锁,并在写入时使用独占锁。

但是为什么我不能在执行读取时锁定互斥锁时等待。

4 个答案:

答案 0 :(得分:2)

用于提高性能。然后,多个并发读取将不必按顺序发生,如果频繁读取结构,这可能是一个很大的好处。 (但读取的数据仍然是一致的和最新的。)

答案 1 :(得分:1)

  

但是为什么我不能在执行读取时锁定互斥锁时等待。

通常为速度。共享锁允许多个读者,因为内容不会改变。独占锁只允许单个(通常)写操作,因为您希望所有写操作都是原子的。

来自here的更多技术定义。

  

独占锁保护文件资源的更新,这两者都是可恢复的   不可恢复的。它们只能由一个交易所拥有   时间。任何需要独占锁定的事务都必须等待   另一个任务目前拥有独占锁或共享锁   请求的资源。共享锁

     

共享锁支持读取完整性。他们确保记录不是   在只读请求期间更新的过程中。共享   锁也可用于防止时间之间更新记录   读取记录和下一个同步点。

答案 2 :(得分:0)

  

但是为什么我不能在执行读取时锁定互斥锁时等待。

因为在某些情况下效率会很低,特别是那些很多线程经常读取数据结构的情况,但很少有人在写,而且不经常。由于如果没有人正在编写多个并发读取是线程安全的,那么对读者进行互斥将是一种浪费。

想象一下服务器和多个客户端在某些共享数据上执行各种事务。如果这些客户中的大多数只是询问信息,而不是改变任何东西,那么如果服务器一次只允许一个客户端读取,那么服务器的性能就会很糟糕。

答案 3 :(得分:0)

共享锁(也称为读锁)禁止任何其他进程请求对文件的指定部分进行写锁定。但是,其他进程可以请求读锁定并继续从资源中读取。

独占锁(也称为写锁定)为进程提供了写入文件的指定部分的独占访问权限,并将阻止任何其他进程获取对资源的任何类型的锁定,直到释放独占锁定为止。

所以读取锁定说“你现在可以阅读,但如果你想写,你必须等待”,而写锁则说“你必须等待”。

有关官方说明,请查看official locks documentation of GNU C library

此外,在许多情况下,共享/独占锁定的上下文是悲观/乐观锁定,这是一种用于处理多用户对同一资源的读/写的方法。这是一个explanation of the methodology