2012-03-02 72 views
0

完全运行。如果是这样class myclass : public somelibrary::thread具有A类在自己的线程

  1. 是否所有呼吁myclass方法在自己的线程中执行怎么办?
  2. 是否只有run()在自己的线程中执行?
  3. 对于每个要在其自己的线程中执行的方法,是否必须在每个方法中创建一个新的线程?

回答

3

如果我这样做class myclass : public somelibrary::thread 这是否意味着所有要求MyClass的方法将在 自己的线程调用?

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

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

在这样的 线程的“运行”方法中,它是唯一在它自己的线程中运行的吗?

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

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

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

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

是的,如果你想让每个方法在自己的线程中运行,但是再次,你几乎肯定不会想要这个。