使用计时器块提升进程间范围的锁,尽管应该返回
boost interprocess scoped lock with timer blocks despite should return
我有一些使用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 的用法
相关文章:
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 通过引用返回的变量的范围
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 是否未定义将对函数范围变量的引用作为值返回
- 我们如何在范围消失时通过引用返回变量
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 为什么此范围基于语句返回一个数字太低的范围
- 范围分辨率运算符在类型:: var的情况下返回什么
- C++. 面试. 关于返回 int* 值问题的范围
- 为什么在.h中定义的私有结构需要.cpp文件中的返回类型中的范围
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 优化的范围检查并返回值
- 为什么对象在作为指针传递时超出范围,而在返回时则不然
- 变量循环范围会导致返回局部变量的地址引用
- 从排序的数字数组中返回数字范围的最快方法是什么?
- 如何检查copy_if是否返回使用ostream_iterator范围内的任何内容
- 具有抽象基类的工厂模式 - 按引用或按值返回?范围界定和切片问题