gpt4 book ai didi

c++ - ( boost )unique_lock 与 conditional_variable 一起使用时的开销

转载 作者:太空狗 更新时间:2023-10-29 23:04:52 30 4
gpt4 key购买 nike

为什么 boost::conditiona_variablewait() 方法需要一个 boost::unique_lock 对象作为参数而不是一个简单的对象boost::mutex?

实际上,unique_lock 的用途根本不是很清楚。为什么我应该在我的 boost::mutex 周围创建另一个包装器对象,这对性能有什么影响?

例如,假设我有两个线程,thread1thread2:

thread1

void process() {
while(true){
while (objectToProcess == NULL) {
boost::unique_lock lock(mutex);
waitingVariable.wait(lock);
}

doSomething(objToProcess);

objToProcess = NULL;
waitingVariable.notify();
}
}

thread2上:

void feedProcessor() {
while(true) {
while (objectToProcess != NULL) {
boost::unique_lock lock(mutex);
waitingVariable.wait(lock);
}

objToProcess = createNewObjectToProcess();
waitingVariable.notify();
}
}

在这种情况下,我发现每次需要调用条件变量的 wait() 方法时都创建新的 unique_lock 对象很浪费。您能告诉我这些对象的用途以及它们是否会引入大量开销吗?

谢谢!

(我发现我的问题与 this question 重叠,但我更关心的是开销而不是目的...)

最佳答案

传入 std::unique_lock 而不是互斥量可确保满足等待函数为其提供已锁定互斥量的要求。如果您可以传入一个互斥量,您可以传入一个未锁定的实例,这样等待函数要么失败,这意味着以某种方式处理错误,要么具有未定义的行为,这不是一件好事。

在优化的构建中,与手动锁定互斥锁相比,使用添加对象可能没有开销(并记住这样做,并根据需要正确解锁)

关于c++ - ( boost )unique_lock 与 conditional_variable 一起使用时的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21252740/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com