2012-05-24 63 views
0

這是這個主題後,下一步:Modifying data in threads原子類型和線程

class Nginx_sender 
{ 
    private: 
     std::atomic_int data; 
     boost::mutex mMutex; 
    void SendMessage(const std::string &msg) 
    { 
     mMutex.lock(); 
     data++; 
     mMutex.unlock(); 

     std::cout << "DATA: " << data << std::endl; 
    } 

    void NewThreadFunction() 
    { 
     while(true) { 
     mMutex.lock(); 
     std::cout << data; 
     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數據始終爲0,並在SendMessage它每次我打電話SendMessage時間而改變。那麼,什麼是正確的方式來處理這個?

+0

您正在將局部變量的地址傳遞給另一個線程,這是一個壞主意。在你的情況下,它可能會失敗,因爲'main'在程序(和另一個線程)退出之前不會返回,但是您應該考慮爲此動態分配。 –

回答

1

從第二個參數中刪除&以進行綁定。您已經有了一個指向該對象的指針,這就是您可能試圖使用的。其次,指針是未初始化的,這也可能是你問題的根源。請注意,您必須確保對象在線程連接之前保持有效。

int main() 
{ 
    Nginx_sender *NginxSenderHandle = new Nginx_sender ; 
    boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, NginxSenderHandle)); 
    // ... 
} 
2

爲什麼你通過Nginx_sender **(雙指針)到boost::bind?這似乎是錯誤的,並且可以解釋爲什麼你的線程似乎在主線程的第二個副本上運行。