修改线程中的数据

时间:2012-05-24 12:35:45

标签: c++ multithreading mutex

我有一个具有以下结构的类:

class Nginx_sender
{
    private:
        std::vector<std::string> mMessagesBuffer;
        boost::mutex mMutex;

       void SendMessage(const std::string &msg)
       {
           mMutex.lock();
           mMessagesBuffer.push_back(msg);
           mMutex.unlock();

           std::cout << "Vector size: " << mMessagesBuffer.size() << std::endl;
       }

       void NewThreadFunction()
       {
          while(true) {
            mMutex.lock();
            if (mMessagesBuffer.size() >= 1) std::cout << ">=1\n";
            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正在新线程中运行,它会检查mMessagesBuffer的大小。现在我在main函数中调用任何地方:NginxSenderHandle->SendMessage("Test");

这会显示:Vector size: 1第一次,2第二次等。

但是!在NewThreadFunction中,它总是== 0.为什么会这样?

2 个答案:

答案 0 :(得分:2)

您最有可能在绑定Nginx_sender时创建另一个副本。你真的需要在将它传递给bind()之前引用NginxSenderHandle(它已经是一个指针)吗? http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_member_pointers

答案 1 :(得分:1)

我打赌编译器在线程本地缓存中缓存一些mMessagesBuffer内部。尝试将“volatile”关键字添加到mMessagesBuffer以禁用此类优化。