2

有人可以解释何时应该使用共享锁。如果我理解正确的话,读取时使用共享锁,写入时使用排他锁。

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

4

4 回答 4

2

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

于 2012-08-31T08:50:23.570 回答
1

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

通常是为了速度。共享锁允许多个读者,因为内容没有改变。排他锁仅允许单个(通常)写入操作,因为您希望所有写入都是原子的。

更多技术定义来自这里

排他锁保护对文件资源的更新,包括可恢复的和不可恢复的。它们一次只能由一项交易拥有。如果另一个任务当前拥有针对所请求资源的独占锁或共享锁,则任何需要独占锁的事务都必须等待。共享锁

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

于 2012-08-31T08:52:41.167 回答
0

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

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

想象一个服务器和多个客户端对一些共享数据进行各种事务。如果这些客户端中的大多数只是简单地询问信息,而不是更改任何内容,那么如果服务器一次只允许一个客户端读取,那么它的性能将会很糟糕。

于 2012-08-31T08:50:27.687 回答
0

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

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

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

有关官方描述,请查看GNU C 库的官方锁文档

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

于 2018-04-02T11:11:45.000 回答