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

Having a class run entirely on its own thread

本文关键字:自己的 线程 运行 一个      更新时间:2023-10-16

如果我执行类似class myclass : public somelibrary::thread 的操作

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

如果我做类似class myclass : public somelibrary::thread的事情这是否意味着在myclass上调用的所有方法都将在中调用他们自己的线索?

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

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

在这样的"run"方法中,唯一在它自己的线程中运行的东西线

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

如果只有run方法在它自己的线程中执行,如果我想在自己的线程中调用的每个方法,而不仅仅是那个方法?

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

我必须在每个方法中创建一个新线程吗?

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