c ++如何访问原子非POD成员变量?

时间:2014-05-28 04:21:55

标签: c++ shared-ptr atomic

我有一个班级

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();"

我有两个问题。

  1. 如何调用原子共享指针中的队列成员函数?

  2. 是否有一些显示对象成员变量的调试内容?让我更好地了解我实际想要玩的东西。

1 个答案:

答案 0 :(得分:0)

static std::atomic<std::shared_ptr<std::queue<buffer<char> > > > queue_;

这里有大红旗。 std::atomic是一个神奇的锁定。当您访问shared_ptr时,它与其他任何广告一样只是shared_ptr

如果您需要锁定,请使用std::mutexstd::lock_guard。如果你不这样做,那就什么都不做。无论如何,std::shared_ptr不应该被装饰。

此外,容器的全局shared_ptr本身就是奇怪的。所有这些都是因为queue必须被显式初始化并且可能被销毁,所以你创建了一个空队列和一个不存在的队列之间的区别。这看起来像无偿的复杂性和开销,而不是简单的全局队列。