2012-05-24 65 views
1

我有以下结构的类:修改数据

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.为什么它会是?

+0

您应该只在持有互斥锁时检查缓冲区大小,如在打印或保存到局部变量中'mMessagesBuffer.size()'的值。看看会发生什么。 – EmeryBerger

+1

你确定你没有意外创建两个'Nginx_sender'吗?发布一个完整的'main',展现行为。 – molbdnilo

回答

1

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

+1

当使用互斥锁时,'volatile'不应该是必需的。 – Haozhun

+0

@Gene编译器不知道互斥锁,是吗? – Ockonal

+0

@Ockonal它没有。但互斥知道如何指示编译器不要破坏它。 – Haozhun