Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.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+进行多任务处理+;。线程还是不同的设计?_C++ - Fatal编程技术网

C++ 使用C+进行多任务处理+;。线程还是不同的设计?

C++ 使用C+进行多任务处理+;。线程还是不同的设计?,c++,C++,我一直使用诸如PHP之类的脚本语言来运行页面、完成运行并给出输出。但是,我想在C++上做一些不同的事情,我需要多线程两个任务。 首先,主线程应该运行(比方说)一个cpu温度计,它每1秒刷新一次,第二个线程应该执行其他操作。(如读取windows目录下的所有目录。) 话虽如此, 使用线程是我唯一的机会,还是我可以为这个任务使用不同的编程概念 特别是在游戏中,有大量的东西在后台运行。例如,NPC/怪物的人工智能、图形引擎、物理引擎、玩家移动、键盘交互等。它们在单个过程中工作,那么如何处理 创建一个线

我一直使用诸如PHP之类的脚本语言来运行页面、完成运行并给出输出。但是,我想在C++上做一些不同的事情,我需要多线程两个任务。 首先,主线程应该运行(比方说)一个cpu温度计,它每1秒刷新一次,第二个线程应该执行其他操作。(如读取windows目录下的所有目录。)

话虽如此,

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

  • 特别是在游戏中,有大量的东西在后台运行。例如,NPC/怪物的人工智能、图形引擎、物理引擎、玩家移动、键盘交互等。它们在单个过程中工作,那么如何处理


  • 创建一个线程,用于读取cpu温度表,并读取每秒钟的目录。多线程没有多大好处,但在管理线程时可能会遇到一些麻烦。你可以把你的任务放在一个列表中,然后用第二种方式安排它们

    我不确定游戏的内容,但我相信他们会对循环中的项目/任务和计划/检查/过程进行分类。一些线程是为一些专用任务创建的,比如套接字通信、gui渲染等,但是为每个项目创建一个专用线程,比如说爬行已经结束了


    我的建议是,如果可以在一个线程中实现多线程,就不要那么容易地将多线程引入应用程序。多线程将产生其他副作用,如同步问题、线程管理问题等。

    线程将是正确的选择

    另一种选择(依赖于操作系统)是分叉子进程。是的,线程也依赖于操作系统,但至少对于C++11来说,有针对SE的标准抽象。对于非C++11应用程序,如果有合适的端口可用,可以很容易地使用为OS或POSIX pthreads库提供的各种线程API

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

    详细阐述你的观点2):

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


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

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


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

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

  • Qt框架
  • POCO C++库,具有子部分.
  • 模板来自C++11。或boost::thread用于旧环境

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

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

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

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


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

    如何在没有计时器之类的隐式后台线程的情况下安排单独的任务??计时器通常意味着某种后台线程,除非您直接使用处理器的硬件计时器和中断,并在触发的协同例程中执行任务。好,这类似于直接使用硬件中断,因为它将唤醒延迟到内核(-thread)。对SIGALRM的响应不会在主线程中执行,不是吗?只要操作系统环境提供进程,是的。