0

を使用するアプリケーションのコードがいくつかありますboost inteprocess scoped lock with timers。1 つのスレッドでミューテックスが取得されると、それを取得するために数ミリ秒間試行錯誤している 2 番目のスレッドは失敗し、画面に何かを記録します。

理由はわかりませんが、boost 1.50 のバージョンではこれが機能しなくなりました。以下のコードでは、スレッド #2 が「エラー」を出力せず、完全にスタックしていることがわかります。

ここで何か不足していますか?

g++ で LINUX カーネル 2.6.32 を使用しています。

UTCに対処するものでしょうか?そのようなロックで使用される時間はUTCであり、現在読んでいる日付時刻ではlocal_adjustor、ローカルからUTCへの変換、およびその逆の変換について読んでいます。

AFG

   #include <iostream>
   #include <boost/interprocess/sync/scoped_lock.hpp>
   #include <boost/date_time/posix_time/posix_time.hpp>
   #include <boost/interprocess/sync/named_mutex.hpp>
   #include <boost/thread.hpp>
   #include <boost/bind.hpp>

   namespace bi = boost::interprocess;


   void  lock_test( bi::named_mutex& mt, bool long_sleep ) { 

           boost::posix_time::ptime pt = 
             boost::posix_time::microsec_clock::local_time()
             +  boost::posix_time::milliseconds(100);

            bi::scoped_lock<bi::named_mutex> l( mt, pt );
            if( l.owns() ){
            std::cout << "Locked"<<std::endl;
            }
            else{
            std::cout << "ERROR" << std::endl;
            std::cout.flush();
            return ;
            }

            if(long_sleep){
                while(true) {sleep(1);std::cout<<"[]";std::cout.flush();}
            }
        }

        int main(){

               bi::named_mutex  m_mutex( bi::open_or_create, "ciao"
               , bi::permissions( 0666  ));
               boost::thread t1 = boost::thread( &lock_test
               , boost::ref( m_mutex), true );
               sleep(4);
               boost::thread t2 = boost::thread(  &lock_test
               , boost::ref(m_mutex), false );
               while(true){sleep(1);}
        }
4

2 に答える 2

0

からに切り替えるboost::posix_time::microsec_clock::local_time()

 boost::posix_time::microsec_clock::universal_time() 

すべて正常に動作します。

于 2012-09-05T09:40:26.503 に答える
0

を使用する必要boost::get_system_time()があります。かなりの数の例があります。信頼できる情報源は見つかりませんが、microsec_clockあなたとまったく同じように使用すると、同様の問題が発生します。バグを発見したばかりですが、修正をテストするときに更新されます。

boost::unique_lock::timed_lock の使用

于 2014-08-15T08:08:57.257 に答える