c ++线程 - 并行处理

时间:2011-04-19 12:19:15

标签: c++ multithreading cross-platform

我想知道如何在c ++中的双核处理器中执行两个进程。

我知道线程(或多线程)不是c ++的内置功能。<​​/ p>

Qt中有线程支持,但我从他们的参考资料中得不到任何理解。 :(

那么,有没有人知道初学者这么做的简单方法。跨平台支持(如Qt)将非常有用,因为我在Linux上。

6 个答案:

答案 0 :(得分:5)

尝试将Multithreading in C++0x part 1: Starting Threads作为101.如果您的编译器没有C++0x支持,请继续使用Boost.Thread

答案 1 :(得分:3)

看看Boost.Thread。这是跨平台的,是在C ++应用程序中使用的非常好的库。

您有什么具体想知道的?

答案 2 :(得分:2)

POSIX线程(pthreads)库可能是你最好的选择,如果你只需要一个简单的线程库,它在Windows和Linux上都有实现。

可以找到指南,例如here。可以下载here。{/ p>的pthreads的Win32实现

编辑:没看到你在Linux上。在那种情况下,我不是100%肯定,但我认为这些库可能已经与您的GCC安装捆绑在一起。

答案 3 :(得分:2)

我建议使用Boost库Boost.Thread。这将包装Win32和Posix的平台细节,并为您提供一组可靠的线程和同步对象。它的使用非常频繁,因此在SO和其他网站上遇到的任何问题都可以找到帮助。

答案 4 :(得分:1)

您可以搜索免费的PDF手册“C ++ - GUI-Programming-with-Qt-4-1st-ed.zip”,并阅读第18章关于Qt中的多线程。

Qt支持的并发编程功能包括(不限于)以下内容:

  • 互斥
  • 读写锁定
  • 信号量
  • 等待条件
  • 线程特定存储

但是,请注意以下与Qt的权衡:

  • 性能惩罚与本机线程库相比。自内核2.4以来,POSIX线程(pthreads)一直是Linux的原生,并且可能无法替代&lt; process.h&gt;在所有情况下都在W32API中。
  • Qt中的线程间通信使用SIGNAL和SLOT结构实现。它们不是C ++语言的一部分,而是作为宏实现的,需要Qt提供的专有代码生成器才能完全编译。

如果您可以忍受上述限制,请按照以下方法使用QThread:

  1. #include&lt; QtCore&gt;
  2. 从QThread中获取自己的类。您必须实现一个返回void的公共函数run()来包含要执行的指令。
  3. 实例化您自己的类并调用start()以启动新线程。
  4. 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;
    }
    

答案 5 :(得分: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完全兼容,在某些情况下可能更适合在不同的操作系统环境中工作。

对于并行 处理,请参阅this