我正在编写一个多线程游戏引擎,我想知道关于等待线程的最佳实践。我突然想到那里可能有比我实施的更好的选择,所以我想知道你们的想法。
选项 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 中保存下来,并且只需检查每个方法顶部的“线程!= NULL”。仍然不理想,但我觉得跳跃越少越好。(我也考虑过在函数上使用“inline”关键字......但是当我真正需要的是“if(thread!= NULL)”检查以确定是否其余代码是否应该执行?)
选项 C)将所有类的方法转换为函数指针,并放弃调用“wait()”的整个概念,除非在实际加载纹理时。我看到了这种方法的优点和缺点……也就是说,这感觉是最难实施和跟踪的。诚然,我对 GCC 的优化和组装,尤其是 memory->cpu->memory 通信的内部工作的了解并不是最好的,因此使用一堆函数指针实际上可能比正确定义的类要慢。
有人有更好的想法吗?