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

boost interprocess scoped lock with timer blocks despite should return

本文关键字:返回 范围 计时器 进程      更新时间:2023-10-16

我有一些使用boost inteprocess scoped lock with timers的应用程序代码。当在一个线程中获取互斥对象时,第二个试图在几毫秒内获取它的线程将失败,并将一些内容记录到screeen。

我不知道为什么,但有了1.5版本的boost,这就不起作用了。下面的代码我可以看到线程#2没有打印"ERROR",但完全卡住了。

我是不是遗漏了什么?

我使用的是带有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);}
        }

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

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

一切都很好。

你应该使用boost::get_system_time(),有很多例子。虽然我找不到权威的来源,但我和你一样使用microsec_clock,也会遇到类似的问题。不过,我刚刚发现了这个错误,将在测试修复程序时更新。

boost::unique_lock::timed_lock 的用法