повысить межпроцессную блокировку с блокировкой таймера, несмотря на то, что должен вернуться

У меня есть код моего приложения, которое использует boost inteprocess scoped lock with timers, Когда мьютекс получен в одном потоке, второй поток, пытающийся получить его в течение нескольких миллисекунд, потерпит неудачу и запишет что-то для проверки.

Я не знаю почему, но с версией boost 1.50 это больше не работает.
Код ниже, я вижу, что поток № 2 не печатает «ОШИБКА», но полностью застрял.

Я что-то здесь упускаю?

Я использую ядро ​​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);}
}

0

Решение

Похоже, что если я переключусь с boost::posix_time::microsec_clock::local_time() в

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

все отлично работает

0

Другие решения

Вы должны использовать boost::get_system_time()Есть немало примеров с этим. Хотя я не могу найти авторитетный источник, я использую microsec_clock Точно так же, как вы делаете, и получите аналогичные проблемы. Только что обнаружил ошибку, обновлю, когда я проверю исправление.

Использование boost :: unique_lock :: timed_lock

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector