修改线程中的数据 [英] Modifying data in threads

查看:131
本文介绍了修改线程中的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类的结构如下:

I have a class with the following structure:

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

NewThreadFunction is running in new thread and it checks the size of mMessagesBuffer. Now I call anywhere in main function: NginxSenderHandle->SendMessage("Test");

这显示了:第一次, 2

但是! NewThreadFunction 它总是== 0.为什么会是?

But! In NewThreadFunction it's always == 0. Why could it be?

推荐答案

我敢打赌编译器缓存一些mMessagesBuffer内部在线程本地缓存。请尝试在mMessagesBuffer中添加volatile关键字,以停用此类优化。

I bet compiler is caching some of mMessagesBuffer internals in thread-local cache. Try adding 'volatile' keyword to mMessagesBuffer to disable such optimizations.

这篇关于修改线程中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆