我是 C++ 并发的新手。我开始使用 boost 线程作为跨平台解决方案。到目前为止,我看到的大多数示例都涉及将单独的函数传递给线程。例如,像这样。在我的情况下,我有一个类有几个类的实例,在我的例子中是 OpenGL 上下文和渲染相关的东西。我了解到将对象分配给线程是通过以下方式完成的:
mythread=new boost::thread(boost::ref(*this));
其中 *this 是指向调用它的实例的指针。但是在这个类实例中复合的其他类呢?我应该对它们中的每一个都做同样的事情,还是一旦我在宿主类上调用它们就会自动线程化?我最初的问题在这个线程中进行了概述。所以,一旦我触发线程,它看起来像 OpenGL 上下文仍保留在主线程中。(请参阅底部的 GPUThread 类)。
这是我的线程类:
GPUThread::GPUThread(void)
{
_thread =NULL;
_mustStop=false;
_frame=0;
_rc =glMultiContext::getInstance().createRenderingContext(GPU1);
assert(_rc);
glfwTerminate(); //terminate the initial window and context
if(!glMultiContext::getInstance().makeCurrent(_rc)){
printf("failed to make current!!!");
}
// init engine here (GLEW was already initiated)
engine = new Engine(800,600,1);
}
void GPUThread::Start(){
printf("threaded view setup ok");
///init thread here :
_thread=new boost::thread(boost::ref(*this));
_thread->join();
}
void GPUThread::Stop(){
// Signal the thread to stop (thread-safe)
_mustStopMutex.lock();
_mustStop=true;
_mustStopMutex.unlock();
// Wait for the thread to finish.
if (_thread!=NULL) _thread->join();
}
// Thread function
void GPUThread::operator () ()
{
bool mustStop;
do
{
// Display the next animation frame
DisplayNextFrame();
_mustStopMutex.lock();
mustStop=_mustStop;
_mustStopMutex.unlock();
} while (mustStop==false);
}
void GPUThread::DisplayNextFrame()
{
engine->Render(); //renders frame
if(_frame == 101){
_mustStop=true;
}
}
GPUThread::~GPUThread(void)
{
delete _view;
if(_rc != 0)
{
glMultiContext::getInstance().deleteRenderingContext(_rc);
_rc = 0;
}
if(_thread!=NULL)delete _thread;
}
当此类运行OpenGL上下文时会发出错误。我无法从缓冲区中读取像素数据。我想这是因为我在调用此之前初始化_rc(渲染上下文)并设置了当前上下文:
_thread=new boost::thread(boost::ref(*this));
我尝试在线程初始化之后执行此操作,但随后它直接跳入线程函数,而对象未初始化。那么在包含所有内容的类上设置 boost 线程的正确方法是什么?