2011-04-19 80 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