0

这是本主题之后的下一步:修改线程中的数据

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。那么,使用这个的正确方法是什么?

4

2 回答 2

2

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

于 2012-05-24T13:47:01.350 回答
1

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

int main()
{
   Nginx_sender *NginxSenderHandle = new Nginx_sender  ;
   boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, NginxSenderHandle));
   // ...
}
于 2012-05-24T13:50:07.350 回答