boost thread - 使用局部变量作为参数

时间:2014-03-17 15:24:10

标签: c++ multithreading boost

我正在使用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  

2 个答案:

答案 0 :(得分:0)

您的InMapsEngine引用未初始化,或者您是否在类构造函数之外进行了设置?

  

InMapsEngine & 引擎_;

您可以使用成员对象

  

InMapsEngine引擎_;

...或在线程调用之前设置引用。

答案 1 :(得分:0)

很难从堆栈跟踪中确切地知道出现了什么问题,但可能是您有多个线程试图同时访问您的共享引擎资源。

执行此操作的一种方法是使用互斥锁和条件变量在您的引擎资源可用时向您的线程发出信号。:

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块中包含睡眠,则可能需要使用常规锁定。只记得解锁。