Boost线程-使用局部变量作为参数

boost thread - use local variable as parameter

本文关键字:参数 局部变量 线程 Boost      更新时间:2023-10-16

我正在编写一个使用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,你可能想使用一个普通的锁。记得解锁