我有一个班级
class connection
{
private:
static std::atomic<std::shared_ptr<std::queue<buffer<char> > > > queue_;
std::thread serviceThread_;
std::shared_ptr<std::condition_variable> notEmpty_;
int fileDesc_;
public:
connection(std::shared_ptr<std::condition_variable> notEmpty,
int fileDesc):
serviceThread_(), notEmpty_(notEmpty), fileDesc_(fileDesc)
{
serviceThread_ = std::thread(&connection::service, this);
}
void service();
void join(){ serviceThread_.join(); }
};
在connection::service()
中,我致电queue_.pop()
或queue_->pop()
试图获得我认为应该排在队列之首的内容。
当我致电queue_.pop()
时,我收到了错误消息:
server/connection.hpp: In member function ‘void connection::service()’:
server/connection.hpp:78:29: error: ‘struct
std::atomic<std::shared_ptr<std::queue<buffer<char> > > >’ has no member named
‘pop’
queue_.pop();"
因为它是一个原子共享指针而足够公平。
如果我拨打queue_->pop()
,我会收到以下错误:
server/connection.hpp: In member function ‘void connection::service()’:
server/connection.hpp:78:28: error: base operand of ‘->’ has non-pointer type
‘std::atomic<std::shared_ptr<std::queue<buffer<char> > > >’
queue_->pop();"
我有两个问题。
如何调用原子共享指针中的队列成员函数?
是否有一些显示对象成员变量的调试内容?让我更好地了解我实际想要玩的东西。
答案 0 :(得分:0)
static std::atomic<std::shared_ptr<std::queue<buffer<char> > > > queue_;
这里有大红旗。 std::atomic
是一个神奇的锁定。当您访问shared_ptr
时,它与其他任何广告一样只是shared_ptr
。
如果您需要锁定,请使用std::mutex
和std::lock_guard
。如果你不这样做,那就什么都不做。无论如何,std::shared_ptr
不应该被装饰。
此外,容器的全局shared_ptr
本身就是奇怪的。所有这些都是因为queue
必须被显式初始化并且可能被销毁,所以你创建了一个空队列和一个不存在的队列之间的区别。这看起来像无偿的复杂性和开销,而不是简单的全局队列。