我正在阅读Thread Synchronization
《Unix 环境中的高级编程》一书。
在本节中,有一个将互斥锁与动态分配的对象一起使用的示例。我对此也有一些疑问。
在这里,我分享发生的事件时间表(从上到下)以解释我的疑问:
- 已创建线程 1。
- Thread1 创建一个 mutex var 对其进行初始化并将其放在全局列表中,以便其他人可以使用它。
- 现在 Thread1 获得了一个锁来使用共享数据结构,比如说
ds
。Thread1 需要做大量的工作ds
,即 Thread1 将长时间获取这个锁。 - 现在,虽然 Thread1 仍然获得了锁,但 Thread2 被创建了。
- 现在Thread2也想用ds。
- 所以 Thread2 必须首先增加显示对 ds 的引用的计数器增加。为此(根据本书),它首先需要
mutex_t
在增加计数之前使用相同的变量获取锁。 - 但是由于 Thread1 已经在这个变量上获得了锁
mutex_t
,所以当 Thread2lock()
在递增计数之前调用时,它必须等到 Thread1 解锁锁。
疑点:
- 关于他在谈论哪个全局列表(意味着只是制作任何列表并将其引用传递给所有线程或任何特定列表)?
- 当 Thread1 创建锁变量时,它将计数设置为 1。然后 Thread2 正在等待将此计数增加到 2。但是假设在执行当前工作之后 Thread1 不需要使用 ds。因此,在解锁之前,它也会减少计数或先解锁,然后
foo_rele()
再次调用锁定并减少计数。现在有可能在 Thread2 增加计数之前,Thread1 减少它。如果是(根据我),那么我的数据结构将被破坏?所以我认为这本书的这个例子有一点错误。如果我们使用不同的 mutex_var 来增加计数会更好吗?