线程安全游戏引擎:多线程最佳实践?

时间:2013-04-19 16:41:28

标签: c++ sdl

我正在编写一个多线程游戏引擎,我想知道等待线程的最佳实践。在我看来,那里可能有比我实施的更好的选择,所以我想知道你们的想法。

选项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;内存通信并不是最好的,因此使用一堆函数指针实际上可能比正确定义的类慢。

任何人都有更好的想法吗?

1 个答案:

答案 0 :(得分:1)

最佳做法通常不是重新发明轮子:D

如果您的编译器支持C ++ 11,您可能需要查看std::thread库。您需要的一切已经实施并尽可能安全(考虑到主题,这不是很安全)。

特别是,您的wait()函数由std :: condition_variable实现。

Boost线程库提供了几乎相同的功能。

我不知道您使用的图书馆抱歉:D