gpt4 book ai didi

c++ - 为什么我们应该将 `std::unique_lock` 放在本地范围内?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:20 30 4
gpt4 key购买 nike

基于 C++ Equivalent to Java's BlockingQueue

void push(T const& value) { // original version
{
std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value);
}
this->d_condition.notify_one();
}

void push(T const& value) { // my question
//{ // comment out the scope
std::unique_lock<std::mutex> lock(this->d_mutex);
d_queue.push_front(value);
//} // comment out the scope
this->d_condition.notify_one();
}

问题:为什么我们要引入本地作用域 {}覆盖std::unique_lockput里面功能?是不是应该先释放锁再调用notify_one否则在我们调用 notify_one 时锁会被持有?

T pop() {
std::unique_lock<std::mutex> lock(this->d_mutex);
this->d_condition.wait(lock, [=]{ return !this->d_queue.empty(); });
T rc(std::move(this->d_queue.back()));
this->d_queue.pop_back();
return rc;
}

问题为什么我们应该使用[=]pop里面功能?

最佳答案

Is it because we should release the lock first before calling notify_one() otherwise the lock is hold while we calling the notify_one()?

正确。有可能另一个线程启动并试图在生产者线程释放它之前获取队列的锁。这会导致它醒来(因为条件变量),然后回到 sleep 状态(因为锁)。

why we should use [=] inside the pop function?

我们正在访问this。 lambda 需要通过某种方法访问d_queue,他们选择按值复制this

关于c++ - 为什么我们应该将 `std::unique_lock` 放在本地范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438303/

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