原子类型和线程

时间:2012-05-24 13:42:01

标签: c++ multithreading mutex atomic

这是本主题之后的下一步:Modifying data in threads

class Nginx_sender
{
    private:
        std::atomic_int data;
        boost::mutex mMutex;
   void SendMessage(const std::string &msg)
   {
       mMutex.lock();
       data++;
       mMutex.unlock();

       std::cout << "DATA: " << data << std::endl;
   }

   void NewThreadFunction()
   {
      while(true) {
        mMutex.lock();
         std::cout << data;
        mMutex.unlock();

        boost::this_thread::sleep(boost::posix_time::milliseconds(200));
      }
   }
};
int main()
{
   Nginx_sender *NginxSenderHandle;
   boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, &NginxSenderHandle));
   // ...
}

NewThreadFunction中,数据始终为0,而​​SendMessage每次调用SendMessage时数据都会更改。那么,使用它的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

为什么要将Nginx_sender **(双指针)传递给boost::bind?这似乎是错误的,并且可以解释为什么你的线程似乎在对象的第二个副本上运行而不是主线程。

答案 1 :(得分:1)

删除&amp;从第二个参数到bind。您已经有一个指向该对象的指针,这就是您可能尝试使用的指针。其次,指针未初始化,这也可能是你问题的根源。注意,在线程加入之前,您必须确保对象保持有效。

int main()
{
   Nginx_sender *NginxSenderHandle = new Nginx_sender  ;
   boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, NginxSenderHandle));
   // ...
}