C++ C+中的自定义阻塞函数+;

C++ C+中的自定义阻塞函数+;,c++,model-view-controller,events,sdl,C++,Model View Controller,Events,Sdl,我正在基于while(true)和一个阻塞函数创建具有三个线程的应用程序模型 事件线程-等待用户输入,被SDL_WaitEvent阻止 套接字线程-等待来自服务器的数据,被阻塞套接字阻塞 渲染线程-从缓冲区渲染数据,而不是阻塞 我在渲染线程时遇到问题-我需要一个阻塞函数,例如,该函数将阻塞直到某个绘制事件(由我定义并在其他两个线程之一中调度)发生。 但我不知道阻塞函数是如何工作的。当然,我可以创建一个sleep()循环,但是这样的循环已经修复了FPS占用资源的问题,即使什么都没有发生(我已经详细

我正在基于
while(true)
和一个阻塞函数创建具有三个线程的应用程序模型

  • 事件线程-等待用户输入,被SDL_WaitEvent阻止
  • 套接字线程-等待来自服务器的数据,被阻塞套接字阻塞
  • 渲染线程-从缓冲区渲染数据,而不是阻塞
  • 我在渲染线程时遇到问题-我需要一个阻塞函数,例如,该函数将阻塞直到某个绘制事件(由我定义并在其他两个线程之一中调度)发生。
    但我不知道阻塞函数是如何工作的。当然,我可以创建一个
    sleep()
    循环,但是这样的循环已经修复了FPS占用资源的问题,即使什么都没有发生(我已经详细阐述了这个主题)。另一方面,它不会立即显示数据。这对GUI应用程序不好


    看起来不错。有多平台版本吗?或者至少是linux 相当于,所以我可以自己写一个

    看看这条线:

    坚持使用pthread_cond_timedwait并使用clock_gettime。例如:

    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    ts.tv_sec += 10; // ten seconds
    while (!some_condition && ret == 0)
        ret = pthread_cond_timedwait(&cond, &mutex, &ts);
    

    如果您使用的是C++11,那么就可以使用
    std::condition\u变量
    std::互斥体

    void
    waitForEvent()
    {
        std::unique_lock<std::mutex> lock( myMutex );
        while ( ! externalCondition ) {
            myConditionVariable.wait( lock );
        }
    }
    
    void
    waitForEvent()
    {
    std::唯一锁(myMutex);
    而(!外部条件){
    myConditionVariable.wait(锁);
    }
    }
    
    要触发事件,请执行以下操作:

    void
    setEvent()
    {
        std::unique_lock<std::mutex> lock( myMutex );
        setExternalCondition();
    }
    
    void
    setEvent()
    {
    std::唯一锁(myMutex);
    setExternalCondition();
    }
    
    另一方面,您提到了GUI和渲染器。你 无法在GUI线程中等待外部条件。如果 您需要在GUI线程中进行渲染,您必须 了解如何在GUI管理器中创建GUI事件,然后发布
    GUI事件

    WaitForMultipleObject呢?这不是你要找的吗?看起来不错。有多平台版本吗?或者至少是linux版本的,所以我可以自己写一个?
    WaitForMultipleObject
    是一个黑客,因为Windows没有条件变量。当您等待外部事件(如传入数据)时,这非常好,但它并不是为内部同步而设计的;获得比赛条件太容易了。为什么要定时等待?(您可能会显示mutext在何时何地被处理。)好吧,这看起来更好,但我有几个问题。首先,什么是
    myMutex
    变量?那么变量定义之后的see
    是什么呢。这不是我第一次见到他们。非常相似,我看不到myConditionVariable的定义。对不起,我是初学者,我只懂非常基本的语法。
    myMutex
    myConditionVariable
    分别是
    std::mutex
    std::condition\u variable
    类型的变量。而
    是模板规范:例如,在使用
    std::vector
    的任何时候,您都必须经常看到它们。是的,我在vector中看到过它们,虽然我不理解它们,但我尽了最大努力避免使用向量。即使
    myConditionVariable
    myMutex
    属于
    std::mutex
    ,它们也不仅仅是从空中弹出的,不是吗?我很抱歉这么烦人,但为了编写工作代码,我需要知道在哪里定义see,或者至少理解整个问题。@TomášZato为什么要避免向量?替代方案通常更复杂。至于定义,
    std::
    中的所有内容都在标准标题中定义。你只要把它包括进去就行了<代码>和
    ,在本例中。