2012-11-29 50 views
1

我是新的C++,只是找到我在这段代码做错了:中的boost ::线程EXC BAD ACCESS加入

我的C++类如下所示:

#include <boost/thread/thread.hpp> 

using namespace std; 

struct AClass::AClassImpl 
{ 
    boost::thread m_thread; 
}; 

AClass::AClass(): pimpl (new AClass::AClassImpl) {} 

AClass::~AClass() { delete pimpl; } 

void AClass::start() 
{ 
    cout << PREFIX << "main() : creating thread, " << endl; 
    pimpl->m_thread = boost::thread(boost::bind(&AClass::process, this)); 
} 

void AClass::stop() 
{ 
    pimpl->m_thread.join(); 
} 

void AClass::process() 
{ 
    cout << PREFIX << "Hello World! Thread ID, " << endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(1000)); 
    return; 
} 

在Xcode我也写一个测试ACLASS用这种方法Objective-C的测试案例:

- (void) testStart 
{ 
    tested->start(); 
    tested->stop(); 
} 

的问题是,我上

一个EXC_BAD_ACCESS
pimpl->m_thread.join(); 

行停止方法。

这是我的头文件:

class AClass { 
public: 
    AClass(); 
    ~AClass(); 
    void start(); 
    void stop(); 

private: 
    struct AClassImpl; //fwd declaration of internal struct 
    AClassImpl * pimpl; //opaque pointer 
    void process(); 
}; 

任何人都可以给我,我做错了什么在这里暗示?

谢谢!

+0

使用武器。此外,您忘了让您的课程不可复制或忘记实施正确的复制和分配。我相信是造成问题的原因(复制)。 – 2012-11-29 20:28:33

+1

感谢您的回复。也许我只是愚蠢的,但我没有看到我在做一个副本的程序中的任何地方。我也尝试调试它,当我在停止功能时,线程似乎很好,据我所见.. – pascalc

+1

“被测试”对象在哪里被创建? –

回答

0

我已经测试使用

int main() 
{ 
    AClass tested; 
    tested.start(); 
    tested.stop(); 
    return 0; 
} 

程序和一切工作的树干。输出是

main() : creating thread, 
Hello World! Thread ID, 

我不知道你如何测试它。你可以试试我的主要?

您正在使用哪个版本的Boost,使用哪个编译器以及在哪个平台上?

+0

嗨!感谢您的回答。我有一段时间没有看过这个问题。我测试过用不同的编译器运行我的代码,并且它也适用于我。它只在XCode失败,这是非常烦人的,因为我正在Mac上进行开发... – pascalc