2012-05-24 70 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