0

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

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

有人有更好的想法吗?

4

1 回答 1

1

最佳实践通常不是重新发明轮子:D

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

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

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

我不知道你正在使用的图书馆抱歉:D

于 2013-04-19T17:40:27.903 回答