SDL2线程段故障

时间:2015-01-03 03:49:47

标签: c++ multithreading segmentation-fault sdl-2 renderer

我正在为SDL2创建一个渲染库,当我尝试使用渲染器执行任何操作时,我遇到了一个seg错误。通过调试我已经确定它是从窗口正确创建的(现在......)但是当我调用SDL_RenderClear(data->renderer)

时我无法弄清楚为什么SDL2是段错误的

主线程调用:

int RenderThread::start(std::string title, int x, int y, int w, int h, Uint32 flags) {
    data.window = SDL_CreateWindow(title.c_str(), x, y, w, h, flags);
    if(data.window == NULL) return -2;
    data.renderer = SDL_CreateRenderer(data.window, -1, 0);
    if(data.renderer == NULL) return -3;
    data.rlist->setRenderer(data.renderer);

    data.run = true;

    if(thread == NULL)
        thread = SDL_CreateThread(renderThread, "RenderThread", (void*)(&data));
    else return 1;

    return 0;
}

然后实际的线程是:

int RenderThread::renderThread(void* d) {
    RenderData* data = (RenderData*)d;
    data->rlist->render(true);
    SDL_SetRenderDrawColor(data->renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_RenderClear(data->renderer);
    while(data->run) {
        data->rlist->render();
        SDL_RenderPresent(data->renderer);
        SDL_Delay(data->interval);
    }
    return 0;
}

如果您需要查看更多代码,请访问github

1 个答案:

答案 0 :(得分:1)

某些平台(例如Windows)不允许与创建它们的线程之外的线程进行交互。

documentation明确说明了这一点:

  

注意:您不应期望能够在主要线程以外的任何线程上创建窗口,渲染或接收事件。


从设计的角度来看,尝试从另一个线程渲染成为许多问题的根源。例如:

  • 是否需要(不可预测)每帧更新一次对象?什么阻止逻辑线程尝试进行无法呈现的许多更新?
  • 是否有可能在没有机会更新对象的情况下冒险重新渲染?
  • 更新发生时你会锁定整个场景吗?或者每个对象都会获得自己的锁定,因此您不会尝试渲染更新中的对象?由于其他线程锁定对象,是否需要帧速率不可预测?

更不用说同步原语的成本了。