尽管应该返回,但使用计时器块提升进程间范围锁

时间:2012-09-04 11:26:31

标签: c++ boost-thread boost-interprocess

我的应用程序的一些代码使用了boost inteprocess scoped lock with timers。当在一个线程中获取互斥锁时,第二个线程获取它几毫秒将失败并将记录某些内容进行筛选。

我不知道为什么但是使用boost 1.50的版本这不再起作用了。 我下面的代码可以看到线程#2没有打印“ERROR”但完全卡住了。

我在这里错过了什么吗?

我正在使用LINUX内核2.6.32和g ++。

它可以处理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);}
        }

2 个答案:

答案 0 :(得分:0)

看起来如果我从boost::posix_time::microsec_clock::local_time()切换到

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

一切正常。

答案 1 :(得分:0)

你应该使用boost::get_system_time(),其中有很多例子。虽然我无法找到权威来源,但我会像你一样使用microsec_clock并得到类似的问题。刚刚发现了这个bug,当我测试修复时会更新。

Usage of boost::unique_lock::timed_lock