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