3

我一直使用诸如 PHP 之类的脚本语言来运行页面、完成运行并给出输出。但是,我想在需要多线程两个任务的 C++ 上做一些不同的事情。

首先,主线程应该运行,(比方说)一个每 1 秒刷新一次的 cpu 温度计,第二个线程应该做其他事情。(比如读取windows目录下的所有目录。)

照这样说;

  1. 使用线程是我唯一的机会,还是我可以为这项任务使用不同的编程概念?

  2. 尤其是在游戏中,有很多东西在后台运行。例如,NPC/Monsters 的 AI、图形引擎、物理引擎、玩家移动、键盘交互等。它们在一个进程中工作,那么它是如何处理的?

4

5 回答 5

3

创建一个线程来读取 CPU 温度计,并且每秒读取目录结束。多线程没有太多好处,但管理线程可能会有些痛苦。您可以将您的任务放在一个列表中,并以第二种方式安排它们。

我不确定游戏的东西,但我相信他们对项目/任务进行分类,并在循环中安排/检查/处理。为某些专用任务(如套接字通信、gui 渲染等)创建了一些线程,但为每个项目创建一个专用线程,说蠕变已经结束。

如果可以在一个线程中完成,我的建议是不要轻易将多线程引入您的应用程序。多线程会产生其他方面的影响,如同步问题、线程管理问题等。

于 2012-11-06T23:43:12.757 回答
2

我认为,您的挑战假定基于任务的并发性。所以,从异步工作的角度来考虑它,而不仅仅是底层线程。但是,许多库为并发任务提供了安全、高效和可靠的高级异步 API。我建议如下:

  1. Qt 与QtConcurrent框架。
  2. 带有多线程子部分的 POCO C++ 库。
  3. 来自 C++11 的std::async模板。或者 boost::thread 用于旧环境。

我应该提到标准的 std::async 或 boost 替换在基于任务的并发方面有不同的问题(它没有提供许多调整执行策略的功能,例如当派生新线程时,当窃取任务时等)

于 2012-11-07T07:45:36.223 回答
0

线程将是正确的选择恕我直言。

一种替代方法(依赖于操作系统)是分叉子进程。是的,线程也依赖于操作系统,但至少对于 C++11,这些线程有标准抽象。对于非 C++11 应用程序,如果有适当的端口可用,则可以轻松使用为操作系统或 POSIX pthreads 库提供的各种线程 API。

非常简单的操作系统的另一种选择是使用所谓的协同程序而不是线程,例如,FreeRTOS 提供了这种方法。

详细说明您的观点2):

这需要实现某种共享内存来在运行自己的执行线程的对象之间交换信息和状态。共享内存需要使用适当的同步机制,如互斥锁、读/写锁、信号量等。

在某些特殊情况下,实现自己的任务调度机制而不是依赖操作系统可能是有意义的。但这也需要一些中断驱动机制来切换您的任务执行。

于 2012-11-06T23:45:35.190 回答
0

这取决于具体的任务和它们之间的依赖关系。

当你有不相关的任务时,我会在单独的进程中运行它们,这里不需要线程。但是,如果您有强耦合,多线程可能是正确的答案。

于 2012-11-07T00:03:03.103 回答
0

您可以使用多个线程或多个进程。

线程和进程之间的一个关键区别是线程共享一个内存空间,而每个进程都有自己的内存空间

如果您的任务需要频繁共享对象,例如在图中插入/删除/搜索/更新节点,多线程将允许每个线程通过指针轻松访问图。这对于多个进程来说更加困难。

如果您的任务不经常共享对象,例如测量温度、渲染图像、播放音乐,那么共享一个内存空间不会给您带来太多好处。在这种情况下,多个进程更适合您。

于 2012-11-08T06:33:59.763 回答