第一个问题是您的 main 函数正在生成一个线程,然后立即退出。在进程终止之前,线程几乎没有机会运行。所以至少你需要等待线程完成,你可以通过在main的末尾添加newThread.join()来完成,因此:
int main(int argc, char* const argv[])
{
MyClass a;
A.push_back(a);
boost::thread newThread(&MyClass::DoSomething, &A.back());
newThread.join();
return 0;
}
另一个问题是线程对象与main 在同一范围内,作为局部变量。虽然您可以在简单的情况下执行此操作,但您需要注意 boost::thread 对象的范围,它需要至少在您希望线程运行时为其提供生命周期。
在对象需要在成员函数上运行线程的情况下,您最好将线程对象封装在对象内,并使用简单的run() 方法来启动工作线程。这样,您可以将所有状态和线程管理以及您可能需要的任何互斥锁和条件变量封装在一个地方。一个简单的例子是这样的:
class Worker
{
public:
Worker();
void start(int N)
{
m_Thread = boost::thread(&Worker::processQueue, this, N);
}
void join()
{
m_Thread.join();
}
// Worker thread where all processing occurs
void processQueue(int N);
private:
boost::thread m_Thread;
};
您可能还想添加诸如返回线程状态(例如,正在运行、已完成、等待等)的标志之类的东西。
我注意到您的示例使用了对象实例的向量(即按值存储)。请注意不要无意中执行导致隐式创建副本的操作,因为这可能会导致线程出现各种问题。 (这就是boost::thread 对象不可复制的原因。)
我在threading with Boost 上写了一篇文章,解释了创建线程的各种方法,包括如何在成员函数上运行线程(参见类型 5)。