0

我的线程不需要被锁定。std::unique_lock锁定施工线程。我只是将cond_var.wait()其用作避免忙于等待的一种方式。我基本上通过将 unique_lock 放在一个很小的范围内来规避自动锁定,因此在它离开这个微小的范围后破坏了唯一的锁。此外,如果相关的话,只有一个消费者线程。

{
std::unique_lock<std::mutex> dispatch_ul(dispatch_mtx);
pq_cond.wait(dispatch_ul);
}

是否有更好的选择来避免 unique_lock 中不必要的自动锁定功能?我正在寻找一个无互斥锁选项来简单地向线程发出信号,我知道std::condition_variable_any但这需要一个互斥锁,这在我的情况下又是不必要的。

4

1 回答 1

1

你需要一个锁来防止这个常见的新手错误:

  1. 生产者线程产生一些东西,
  2. 生产者线程调用some_condition.notify_all()
  3. 生产者线程空闲一段时间,

同时:

  1. 消费者线程调用some_condition.wait(...)
  2. 消费者线程等待,...
  3. 并等待,...
  4. 并等待。

条件变量不是标志。它不记得它被通知了。如果生产者调用notify_one()notify_all() 消费者进入调用之前wait()调用,则通知“丢失”。

为了防止丢失通知,必须有一些共享数据告诉消费者是否需要等待,并且必须有一个锁来保护共享数据。

生产者应该:

  1. 锁上锁,
  2. 更新共享数据,
  3. 通知条件变量,
  4. 释放锁

消费者必须:

  1. 锁上锁,
  2. 检查共享数据是否需要等待,
  3. 需要的话等一下
  4. 随便吃,
  5. 释放锁。

消费者需要将锁传递给wait(...)调用,以便wait(...)可以暂时解锁它,然后在返回之前重新锁定它。如果wait(...)没有解锁锁,那么生产者将永远无法接通notify()电话。

于 2022-03-02T17:04:21.177 回答