gpt4 book ai didi

c++ - 我在这里没有看到比赛条件?

转载 作者:太空宇宙 更新时间:2023-11-04 15:39:51 26 4
gpt4 key购买 nike

这是书中的示例代码:

#include <exception>
struct empty_stack: std::exception
{
const char* what() const throw();
};

template<typename T>
class threadsafe_stack
{
private:
std::stack<T> data;
mutable std::mutex m;

public:
threadsafe_stack(){}
threadsafe_stack(const threadsafe_stack& other)
{
std::lock_guard<std::mutex> lock(other.m);
data=other.data;
}

threadsafe_stack& operator=(const threadsafe_stack&) = delete;

void push(T new_value)
{
std::lock_guard<std::mutex> lock(m);
data.push(std::move(new_value));
}

std::shared_ptr<T> pop()
{
std::lock_guard<std::mutex> lock(m);
if(data.empty()) throw empty_stack();
std::shared_ptr<T> const res(std::make_shared<T>(std::move(data.top())));
data.pop();
return res;
}

void pop(T& value)
{
std::lock_guard<std::mutex> lock(m);
if(data.empty()) throw empty_stack();
value=std::move(data.top());
data.pop();
}

bool empty() const
{
std::lock_guard<std::mutex> lock(m);
return data.empty();
}
};

它说:

there's a potential for a race condition between empty() and either of the pop() functions, but because the code explicitly checks for the contained stack being empty while holding the lock in pop() this race condition isnt problematic

如果它们都在“全局”互斥锁锁定的情况下完成,这怎么会成为竞争条件?

最佳答案

竞争条件在客户端代码中:

threadsafe_stack<int> st;
...
if (!st.empty()) {
int value = st.pop(); // Kaboom
//...
}

或者换句话说,另一个线程可以在 empty() 和 pop() 方法调用之间弹出堆栈。这通常就是为什么细粒度锁定不起作用并且需要由客户端程序员处理的原因。最不可能做对的人。

您应该将 pop() 替换为 trypop() 以使其成为线程安全的。

关于c++ - 我在这里没有看到比赛条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229979/

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