如果我执行class myclass : public somelibrary::thread
myclass
上调用的所有方法都是在自己的线程中执行的吗?run()
在自己的主题中执行了吗?答案 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线程相比非常便宜,但通常不会为每个方法生成新线程。运行许多线程或不断创建/销毁线程的程序是设计糟糕程序的标志。
我是否必须在每种方法中创建一个新线程?
是的,如果你希望每个方法都在自己的线程中运行,但是再次,你几乎肯定不希望这样。