0

これは、このトピックの次のステップです:スレッド内のデータの変更

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。それで、これを扱う正しい方法は何ですか?

4

2 に答える 2

2

なぜNginx_sender **(ダブルポインタ)をに渡すのboost::bindですか?これは間違っているように思われ、スレッドがメインスレッドよりもオブジェクトの2番目のコピーで動作しているように見える理由を説明します。

于 2012-05-24T13:47:01.350 に答える
1

バインドする2番目の引数から&を削除します。あなたはすでにオブジェクトへのポインタを持っています、そしてそれはあなたがおそらく使用しようとしているものです。次に、ポインタが初期化されていないため、問題の原因となる可能性があります。スレッドが結合されるまで、オブジェクトが有効なままであることを確認する必要があることに注意してください。

int main()
{
   Nginx_sender *NginxSenderHandle = new Nginx_sender  ;
   boost::thread sender(boost::bind(&Nginx_sender::NewThreadFunction, NginxSenderHandle));
   // ...
}
于 2012-05-24T13:50:07.350 に答える