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

时间:2012-03-02 05:26:45

标签: c++ multithreading inheritance

如果我执行class myclass : public somelibrary::thread

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

1 个答案:

答案 0 :(得分:3)

  

如果我做class myclass : public somelibrary::thread之类的话   这是否意味着将调用myclass上调用的所有方法   他们自己的线程?

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

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

  

在“run”方法中,唯一的东西是在自己的线程中运行   线程?

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

  

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

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

  

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

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