Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于多线程的问题_C++_Multithreading - Fatal编程技术网

C++ 关于多线程的问题

C++ 关于多线程的问题,c++,multithreading,C++,Multithreading,我想制作一个简单的GUI API。基本上,它的工作方式是gui小部件基本上是无限循环中的一个线程。线程有一个指向小部件类的指针。我希望它的工作方式基本上类似于WinAPI。我会这样做: textbox->SendMessage("Click",args); 然后将其添加到队列中进行处理。最终,这将调用一个指向的函数,该函数将是click事件处理程序。我希望能够做的另一件事是在类中安全地获取和设置内容,而不必担心工作线程是否正在使用它。例如,如果我在工作人员解队列时发送消息(添加到队列)

我想制作一个简单的GUI API。基本上,它的工作方式是gui小部件基本上是无限循环中的一个线程。线程有一个指向小部件类的指针。我希望它的工作方式基本上类似于WinAPI。我会这样做:

textbox->SendMessage("Click",args); 
然后将其添加到队列中进行处理。最终,这将调用一个指向的函数,该函数将是click事件处理程序。我希望能够做的另一件事是在类中安全地获取和设置内容,而不必担心工作线程是否正在使用它。例如,如果我在工作人员解队列时发送消息(添加到队列),这可能会导致问题。我正在使用boost::thread。我应该为我的处境做些什么


谢谢

这听起来很像“活动对象”模式,对象在自己的私有线程中运行对其方法的调用


既然你使用C++,你可能会发现Habor萨特的有效并发是有用的。

< P>你有没有理由在GUI开发中使用这个路径?p> 几乎所有GUI库都依赖于单个线程来管理“小部件”,这是一个很好的理由。多线程是困难的;当编写带有大型公开接口的控件时,您需要非常小心地设计它。随着线程(widget)数量的增加,当接近操作系统的线程限制时,您还将面临可伸缩性问题,或者如果达不到该限制,则会增加调度程序的负载,从而导致一些线程开始耗尽


我的建议是重新设计一个典型的单线程消息泵,将输入事件推送到小部件中,并提取它们的结果状态。

你的意思是,“这听起来很像“活动对象”反模式。@Chris,你只是同意Ryan的说法,这不是GUI开发的好方法,还是你反对”一般来说,活动对象模式?你能详细说明一下吗?我一般都反对活动对象模式——至少当表示为“每个对象的线程”时是这样(并且用传统语言实现,其中线程是实际的OS线程)。在这种情况下,这是一种实现并发性的方法。实际上,操作系统线程通常具有较高的成本,与创建和保留多个线程以及在它们之间进行调用相关,因此可伸缩软件尝试在活动线程和CPU核之间保持奇偶性。那么,是否适合为我的所有小部件仅使用一个线程?我很抱歉为我的游戏做这个,让gui与游戏渲染在同一个线程上会更好吗?这是一个多大的游戏?这是一个单独的项目吗?如果这是一个单独的游戏,专注于让游戏而不是引擎。在一个线程上做所有事情,专注于明确、定义良好的边界,这可以让你优化渲染g以后。许多小团队(或独奏)如果游戏开发人员试图创建大型引擎基础设施而不是真正的游戏,那么他们就会失败。如果这是为了一个更大的项目,或者纯粹为了一个API/引擎;使用一个单独的线程,渲染到屏幕外的表面,并让渲染线程在标记为脏时从中拉出。关键是:将GUI保持在单个线程上(最好是与游戏处理相同的线程)这样你就可以担心实际编写小部件而不是调试比赛条件。好的,非常感谢:)我会听从你的建议,我认为这将是最好的