gpt4 book ai didi

c++ - 让一个类完全在自己的线程上运行

转载 作者:行者123 更新时间:2023-11-28 00:59:30 24 4
gpt4 key购买 nike

如果我做类似class myclass : public somelibrary::thread

  1. 是否所有在 myclass 上调用的方法都在它们自己的线程中执行?
  2. 是否只有run()在自己的线程中执行?
  3. 对于要在其自己的线程中执行的每个方法,我是否必须在每个方法中创建一个新线程?

最佳答案

If I do something like class myclass : public somelibrary::thread does this mean that all methods called on myclass will be called in their own thread?

不一定。这取决于 somelibrary::thread 的设计。事实上,Boost.Thread不以这种方式使用(通过继承)。在这种情况下,您只需创建一个新的 boost::thread 对象,将可调用对象(仿函数、函数指针等)传入其构造函数。

但是,我还没有看到任何线程库在从 somelibrary::thread 派生的类上调用任何方法来生成新线程。那就是要求数据竞争,除非一切都以某种方式同步。但是你的代码会浪费大量时间等待同步原语。更不用说线程在操作系统资源方面是比较昂贵的。假设一个应用程序不是由白痴设计的,它可能在任何时候最多有多个线程在运行。另一方面,在应用程序运行期间,方法可能会被调用很多次。

Is the only thing run in it's own thread in the "run" method of such thread?

并非所有线程库在运行新线程时都会调用 run() 方法。例如在Boost.Thread中,入口点是operator()()。但是,是的,入口点在它自己的线程中运行,与调用线程分开。 run() 直接或间接调用的所有方法都在新生成的线程中运行。

If only the run method is executed in it's own thread, what if I want every method to be called in it's own thread instead of just that one?

这几乎肯定不是您在 C++ 中真正想要的,因为线程在操作系统资源方面非常昂贵。您将使您的操作系统一直浪费时间分配和销毁线程。即使是像 Erlang 这样的语言,与 OS 线程相比,线程非常便宜,您通常不会为每个方法生成一个新线程。运行许多线程或不断创建/销毁线程的程序是程序设计不当的标志。

Do I have to create a new thread in each method?

是的,如果您希望每个方法都在其自己的线程中运行,但同样,您几乎肯定不希望这样。

关于c++ - 让一个类完全在自己的线程上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9528422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com