2012-03-02 83 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線程相比非常便宜,但通常不會爲每種單一方法生成一個新線程。運行多個線程或不斷創建/銷燬線程的程序是一個設計得不好的程序的標誌。

我是否必須在每種方法中創建一個新線程?

是的,如果你想讓每個方法在自己的線程中運行,但是再次,你幾乎肯定不會想要這個。

相關問題