我正在编写一个多线程游戏引擎,我想知道等待线程的最佳实践。在我看来,那里可能有比我实施的更好的选择,所以我想知道你们的想法。
选项A)“wait()”方法在类中的每个其他方法的顶部被调用。这是我目前的实施,我发现它并不理想。
class Texture {
public:
Texture(const char *filename, bool async = true);
~Texture();
void Render();
private:
SDL_Thread *thread;
const char *filename;
void wait();
static int load(void *data);
}
void Texture::wait() {
if (thread != NULL) {
SDL_WaitThread(thread, NULL);
thread = NULL;
}
}
int Texture::load(void *data) {
Texture *self = static_cast<Texture *>(data);
// Load the Image Data in the Thread Here...
return 0;
}
Texture::Texture(const char *filename, bool async) {
this->filename = filename;
if (async) {
thread = SDL_CreateThread(load, NULL, this);
} else {
thread = NULL;
load(this);
}
}
Texture::~Texture() {
// Unload the Thread and Texture Here
}
void Texture::Render() {
wait();
// Render the Texture Here
}
选项B)将“wait()”方法转换为函数指针。这会将我的程序保存在每个其他方法顶部的jmp中,只需在每个方法的顶部检查“thread!= NULL”。仍然不理想,但我觉得跳跃越少越好。 (我也考虑过在函数上使用“inline”关键字...但是当我真正需要的是“if(thread!= NULL)”检查来确定是否包含wait函数的全部内容应该执行其余的代码吗?)
选项C)将所有类的方法转换为函数指针,并抛弃调用“wait()”的整个概念,除非实际加载纹理。我看到这种方法的优点和缺点......也就是说,这感觉最难以实现和跟踪。不可否认,我对GCC优化和汇编的内部工作知识,特别是内存 - &gt; cpu-&gt;内存通信并不是最好的,因此使用一堆函数指针实际上可能比正确定义的类慢。
任何人都有更好的想法吗?
答案 0 :(得分:1)
最佳做法通常不是重新发明轮子:D
如果您的编译器支持C ++ 11,您可能需要查看std::thread库。您需要的一切已经实施并尽可能安全(考虑到主题,这不是很安全)。
特别是,您的wait()
函数由std :: condition_variable实现。
Boost线程库提供了几乎相同的功能。
我不知道您使用的图书馆抱歉:D