2011-04-19 88 views
2

我想知道如何在C++中的雙核處理器中執行兩個進程。我知道線程(或多線程)不是C++的內置功能。C++線程 - 並行處理

在Qt中有線程支持,但我從他們的參考文獻中不能理解任何東西。 :(

因此,沒有人知道對於初學者做一個簡單的方法。跨平臺支持(如QT),因爲我在Linux將是非常有益的。

回答

2

POSIX線程(並行線程)庫可能是你最好的選擇,如果你只需要一個簡單的線程庫,它的實現無論在Windows和Linux。

的指南,可以發現如here。一個Win32執行並行線程可以下載here

編輯:沒有看到你在Linux上,在這種情況下,我不是100%確定的,但我想這些庫可能已經與您的GCC安裝捆綁在一起。

3

看看Boost.Thread。這是跨平臺的,是一個非常好的庫,可用於C++應用程序。

您特別想知道什麼?

2

我建議使用Boost庫Boost.Thread來代替。這將包裝Win32和Posix的平臺特性,併爲您提供一套可靠的線程和同步對象。這也是非常繁重的用途,所以尋找SO和其他網站遇到的任何問題的幫助很容易。

+2

+1:這包含在C++ 0x中,所以它也應該是面向未來的。 – rubenvb 2011-04-19 12:36:50

1

您可以搜索一個免費的PDF書籍「C++ - GUI編程與 - Qt的4-1st -ed.zip「並閱讀第18章關於Qt中的多線程。 Qt支持

併發編程功能,包括(但不限於)以下內容:

  • 互斥
  • 讀寫鎖
  • 信號燈
  • 等待條件
  • 線程專有存儲

但是,請注意以下與Qt的取捨:

  • 性能處罰vs本地線程庫。從內核2.4開始,POSIX線程(pthreads)就是Linux本身,並且在所有情況下都不能替代W32API中的< process.h>。
  • Qt中的線程間通信是通過SIGNAL和SLOT結構實現的。這些不是C++語言的一部分,並且被實現爲宏,這需要Qt提供的專有代碼生成器才能被完全編譯。

如果你可以用上述限制住,只要按照這些食譜使用的QThread:

  1. 的#include < QtCore>
  2. 派生從QThread的自己的類。您必須實現一個公共函數run(),該函數返回void以包含要執行的指令。
  3. 實例化你自己的類並調用start()來啓動一個新的線程。

Sameple代碼:

#include <QtCore> 

class MyThread : public QThread { 
public: 
    void run() { 
     // do something 
    } 
}; 

int main(int argc, char** argv) { 
    MyThread t1, t2; 
    t1.start(); // default implementation from QThread::start() is fine 
    t2.start(); // another thread 
    t1.wait(); // wait for thread to finish 
    t2.wait(); 
    return 0; 
} 
1

在C++ 14的一個重要音符,穿線使用併發可用:

#include<thread> 

class Example 
{ 
    auto DoStuff() -> std::string 
    { 
    return "Doing Stuff"; 
    } 

    auto DoStuff2() -> std::string 
    { 
    return "Doing Stuff 2"; 
    } 
}; 

int main() 
{ 
    Example EO; 
    std::string(Example::*func_pointer)(); 
    func_pointer = &Example::DoStuff; 
    std::future<string> thread_one = std::async(std::launch::async, func_pointer, &EO); //Launching upon declaring 

    std::string(Example::*func_pointer_2)(); 
    func_pointer_2 = &Example::DoStuff2; 
    std::future<string> thread_two = std::async(std::launch::deferred, func_pointer_2, &EO); 
    thread_two.get(); //Launching upon calling 
} 

兩個std::asyncstd::launch::asyncstd::launch::deferred)和std::thread與Qt完全兼容,並且在某些情況下可能是b在不同的操作系統環境中工作。

對於並行處理,見this