在线程修改数据(Modifying data in threads)

2019-09-17 11:01发布

我有以下结构的类:

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,但为什么会这样?

Answer 1:

我敢打赌,编译器缓存一些mMessagesBuffer内部的本地线程缓存。 尝试添加“挥发”关键字mMessagesBuffer禁用此类优化。



Answer 2:

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



文章来源: Modifying data in threads