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: 11回目、22回目など。

だが!常に==0です。NewThreadFunctionなぜそうなるのでしょうか。

4

2 に答える 2

2

バインドするときに、おそらくNginx_senderの別のコピーを作成しています。bind()に渡す前にNginxSenderHandleを本当に参照する必要がありますか(すでにポインターです)? http://www.boost.org/doc/libs/1_49_0/libs/bind/bind.html#with_member_pointers

于 2012-05-24T17:25:19.897 に答える
1

コンパイラがmMessagesBuffer内部の一部をスレッドローカルキャッシュにキャッシュしているに違いありません。このような最適化を無効にするには、mMessagesBufferに「volatile」キーワードを追加してみてください。

于 2012-05-24T12:47:48.000 に答える