Boost线程-使用局部变量作为参数
boost thread - use local variable as parameter
我正在编写一个使用boost线程的c++类。该类的目的是启动一个新线程,在该线程中每2秒生成一个名为LocationEstimatePF的对象,并调用另一个类中的回调函数,将此LocationEstimatePF作为参数。
像这样:
void Simulator::startSimulation() {
running_ = true;
sim_thread_ = new boost::thread(boost::bind(&Simulator::run, this));
}
void Simulator::run() {
for (;;) {
if(running_){
try {
//Generate estimate
LocationEstimatePF estimate(1,2,3,4,5);
engine_.updateLocationEstimate(estimate);
//Wait for 2 seconds for next estimate
boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
} catch (boost::thread_interrupted&) {
return;
}
}
}
}
引擎和线程被定义为.h文件中的成员变量,如下所示:
InMapsEngine& engine_;
boost::thread* sim_thread_;
和Engine类中的回调方法:
void updateLocationEstimate(const LocationEstimatePF& estimate) { Log::info("Test");};
现在,当我运行上面的startSimulation()时,我得到一个分割错误。现在,我知道engine_是正确设置的,我甚至可以调用其他方法没有问题。我认为问题出在局部变量上,你们知道吗?引擎中的"测试"从未打印出来。
这里是堆栈跟踪:
I/DEBUG (11781): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000
I/DEBUG (11781): r0 00000000 r1 66da3e68 r2 00000001 r3 00000000
I/DEBUG (11781): r4 001e8480 r5 00000000 r6 00000000 r7 40490000
I/DEBUG (11781): r8 62055ab0 r9 66da3e68 sl 3f800000 fp 40000000
I/DEBUG (11781): ip 00000001 sp 66da3e60 lr 61864604 pc 616b0a4e cpsr 60000030
I/DEBUG (11781): d0 4158b82020000000 d1 3f110612c247fff9
I/DEBUG (11781): d2 400b8ae93f57e022 d3 400b8ae943697f55
I/DEBUG (11781): d4 c2ef3a464385c588 d5 407eb7ac40c0a412
I/DEBUG (11781): d6 40dd1ce4bec8a7a3 d7 0062e080400b8ae9
I/DEBUG (11781): d8 3fd9b1b440400000 d9 0000000000000000
I/DEBUG (11781): d10 0000000000000000 d11 0000000000000000
I/DEBUG (11781): d12 0000000000000000 d13 0000000000000000
I/DEBUG (11781): d14 0000000000000000 d15 0000000000000000
I/DEBUG (11781): d16 3fe0000000000000 d17 4158b82000000000
I/DEBUG (11781): d18 3fd7e1cb1c913900 d19 3fc41a88bb99a35a
I/DEBUG (11781): d20 0000000000000000 d21 3fac47489540ee39
I/DEBUG (11781): d22 3f8293cfee13fd75 d23 3f96eb1df9afa780
I/DEBUG (11781): d24 3f5871d465fee876 d25 3f6e1beddd51e95d
I/DEBUG (11781): d26 3f30d636137869f2 d27 3f439d2605c8ef21
I/DEBUG (11781): d28 3fe66819a15509c2 d29 3f13d11c3e64b4a4
I/DEBUG (11781): d30 bef375cbdb605373 d31 3f8b5c41074afda1
I/DEBUG (11781): scr 80000093
I/DEBUG (11781):
I/DEBUG (11781): backtrace:
I/DEBUG (11781): #00 pc 00367a4e /data/app-lib/de.tum.ei.lmt.inmaps3d-1/libInMapsJNI.so (Simulator::run()+69)
I/DEBUG (11781): #01 pc 0051b600 /data/app-lib/de.tum.ei.lmt.inmaps3d-1/libInMapsJNI.so
I/DEBUG (11781):
I/DEBUG (11781): stack:
I/DEBUG (11781): 66da3e20 83a88000
I/DEBUG (11781): 66da3e24 02ed263d
I/DEBUG (11781): 66da3e28 83a88000
I/DEBUG (11781): 66da3e2c 02ed263d
I/DEBUG (11781): 66da3e30 61f05dd3
I/DEBUG (11781): 66da3e34 0004f4cf
I/DEBUG (11781): 66da3e38 532719d5 /dev/ashmem/dalvik-mark-stack (deleted)
I/DEBUG (11781): 66da3e3c 176a6e38
I/DEBUG (11781): 66da3e40 61c0ee99 /data/app-lib/de.tum.ei.lmt.inmaps3d-1/libInMapsJNI.so
I/DEBUG (11781): 66da3e44 001e8480
I/DEBUG (11781): 66da3e48 00000000
I/DEBUG (11781): 66da3e4c 00000000
I/DEBUG (11781): 66da3e50 40490000 /system/lib/libskia.so (GrGLCaps::initStencilFormats(GrGLContextInfo const&)+808)
I/DEBUG (11781): 66da3e54 62055ab0
I/DEBUG (11781): 66da3e58 df0027ad
I/DEBUG (11781): 66da3e5c 00000000
I/DEBUG (11781): #00 66da3e60 001e8480
I/DEBUG (11781): 66da3e64 00000000
I/DEBUG (11781): 66da3e68 00000000
I/DEBUG (11781): 66da3e6c 00000000
I/DEBUG (11781): 66da3e70 00000000
I/DEBUG (11781): 66da3e74 00000000
I/DEBUG (11781): 66da3e78 00000000
I/DEBUG (11781): 66da3e7c 00000000
I/DEBUG (11781): 66da3e80 3f800000
I/DEBUG (11781): 66da3e84 40000000
I/DEBUG (11781): 66da3e88 40400000 /system/lib/libskia.so
I/DEBUG (11781): 66da3e8c 00000000
I/DEBUG (11781): 66da3e90 00000000
I/DEBUG (11781): 66da3e94 40490000 /system/lib/libskia.so (GrGLCaps::initStencilFormats(GrGLContextInfo const&)+808)
I/DEBUG (11781): 66da3e98 00000000
I/DEBUG (11781): 66da3e9c 16c16c17
你的InMapsEngine引用没有初始化,或者你在类构造函数之外设置它吗?
InMapsEngine & engine_;
可以用成员对象代替
InMapsEngine engine_;
…或者在线程调用它之前设置引用。
很难从你的堆栈跟踪中确切地看出是什么出了问题,但它可能是你有多个线程试图同时访问你的共享引擎资源。
一种方法是使用互斥锁和条件变量,当引擎资源可用时向线程发出信号。:
try{
boost::mutex::scoped_lock lock(engine_mutex);
m_condition.wait(lock);
engine_.updateLocationEstimate(estimate);
m_condition.notify_one();
}
catch (boost::thread_interrupted&) {
return;
}
boost::this_thread::sleep(boost::posix_time::milliseconds(2000));
如果你想在try块中包含你的sleep,你可能想使用一个普通的锁。记得解锁
相关文章:
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用此关键字)?
- 在返回参数列表中C++局部变量(如CodeFights所示)
- 在 pthread_create() 中使用局部变量作为参数有效吗?
- 指针或局部变量,用于函数的输出参数
- C 11-当我将局部变量作为参数传递到线程中时,它是否安全
- 通过引用参数将局部变量分配给
- 如何将带有局部变量的一些参数的函数包装器放入具有MSVC2015的容器中
- C++ 对局部变量的引用与对参数的引用
- 局部变量作为非类型参数,具有模板规范
- 局部变量的内存地址根据 lambda 参数的预感而变化
- pthread_create以局部变量作为参数
- 为什么我不能将局部变量的引用作为非类型模板参数?
- 将引用参数分配给局部变量
- 作为非typename参数的局部变量
- 如何迭代可变模板参数来创建可变数量的局部变量
- 直接使用函数参数vs创建局部变量
- 在程序中使用非类型模板参数而未给局部变量赋值时,会导致意外结果
- 局部变量作为非类型模板参数
- 访问与局部变量(或参数)同名的成员字段