gpt4 book ai didi

c++ - 使用类对象提升线程 worker

转载 作者:行者123 更新时间:2023-11-28 07:41:29 28 4
gpt4 key购买 nike

我是 C++ 并发的新手。我开始使用 boost 线程,因为它们提供跨平台解决方案。到目前为止,我看到的大多数示例都涉及将单独的函数传递给线程。如 this例如。在我的例子中,我有一个类有几个类的实例,在我的例子中是 OpenGL 上下文和渲染相关的东西。我了解到将对象分配给线程是这样完成的:

mythread=new boost::thread(boost::ref(*this));

其中 *this 是指向调用它的实例的指针。但是在这个类实例中复合的其他类呢?我应该对它们中的每一个都做同样的事情,还是一旦我在主机类上调用它,它们就会自动线程化?this 中概述了我原来的问题thread.So ,一旦我触发线程,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 线程的正确方法是什么?

最佳答案

简短回答:您需要移动 OpenGL 调用 glMultiContext::getInstance().makeCurrent(_rc)可能还有 new Engine()来自 GPUThread 的电话构造函数进入GPUThread::operator()()的开头.

更长的答案:OpenGL 上下文似乎以某种方式绑定(bind)到特定线程,如 here 所示.您需要调用makeCurrent() 在您要绑定(bind)上下文的线程中运行时。您当前运行的线程是 makeCurrent() 的(完全隐式的)参数。 .

您正在调用 GPUThread来自主线程的构造函数,那么你正在调用 GPUThread::Start()从你的主线程。您实际在子线程上运行的第一个位置在 GPUThread::operator()() 的顶部。功能。那就是glMultiContext::getInstance().makeCurrent(_rc)的地方必须调用(在调用 engine->Render() 之前)。

我不明白 OpenGL makeCurrent() 的设计原理.我最好的猜测是他们必须在 OpenGL 上下文的实现中使用某种线程本地存储,或者其他东西。 “普通”2D Windows 的设备上下文也有关于绑定(bind)到单个线程的限制,这让我猜测 OpenGL 可能有类似的限制。

关于c++ - 使用类对象提升线程 worker ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15765559/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com