C ++中的多线程...从哪里开始?

时间:2010-06-26 17:35:20

标签: c++ multithreading portability

我想开始用C ++学习多线程。我也在Java中学习它。在Java中,如果我编写一个使用多线程的程序,它将在任何地方工作。但是在C ++中,多线程不依赖于特定于平台的API吗?如果是这样,那似乎会妨碍可移植性。

如何在不导致可移植性问题的情况下在C ++中进行多线程处理? boost的thread库是一个很好的解决方案吗?

作为旁注 - 如何将多线程实现为库?这不是必须由编译器完成的事情吗?

10 个答案:

答案 0 :(得分:15)

如果您还没有支持C++0x的编译器(例如,可用Visual Studio c ++ 2010),请使用boost线程。 (除非你使用的框架已经支持线程,但事实并非如此 - 否则你不会问这个问题 - )。这些提升线程实际上成为全新C ++的标准。在此之前,C ++本身就是线程不知道的。

如果你想学习并行编程的其他方面,

TBB Threading Building Blocks也可能对你很有意思。

关于Qt:如果你只想要线程支持,则完全是过度的。从编译到结果,它的往返时间非常慢。这是真正精心设计的思想。但不是像boost这样的C ++ 0x线程的官方标准。因此,我不会把它作为第一选择。

答案 1 :(得分:4)

在C ++中,是的线程是特定于平台的。但是,许多线程库在各种平台上封装了线程的细微差别,提供了一个统一的API来编写线程应用程序,因此您不必担心平台特定的细节。

Boost线程库是一个非常好的解决方案。

我还建议您查看ACE

答案 2 :(得分:4)

让我们向后开始:

  

如何在库中实现线程?

它不是,至少不是(纯)C ++。这需要语言支持(编译器只是一个实现)。

目前使用了两件事:

  • 某些部分的汇编代码(例如pthread库中的
  • 针对他人的特定编译器指令(取决于编译器和平台)

两者都很脆弱,需要大量的便携性工作。基本上它意味着代码中有很多#ifdef部分用于测试编译器和目标体系结构,测试某些指令的支持等等......

这就是为什么认为有必要在C ++ 0x中添加线程支持。

  

我如何进行多线程处理?

即使在选择库之前,也应该选择一种方法。有两种编程多线程应用程序的方法(你可以将它们组合起来):

  • 通过共享进行通信:这意味着使用互斥,原子操作等...您可以在Linux平台上使用pthread,但我建议使用Boost.Thread(等等) )它的便携性。
  • 通过沟通共享:更新,并适应分布式计算,这源于函数式语言。这意味着将消息从一个线程传递到另一个线程而不共享任何资源。您可以使用FastFlow或英特尔Thread Building Blocks又称TBB

你可以想象两者合并,但最好不要。就个人而言,我发现FastFlow的描述非常棒:它鼓励无锁编程。此外,第二种方法的主要优点是它更适合于多进程编程并扩展到分布式环境。

首先,我建议关注其中一个并使用它构建一些应用程序。当你感到舒服时,你可以尝试另一个,但是要准备重新开始,他们就是那么不同。

答案 3 :(得分:2)

//This program explains how pthread works, here 5 thread are trying to update a global variable simultaneously but with locking synchronization in maintained
#include<iostream>
#include<pthread.h>
using namespace std ;

#define MAX_NO_THREAD 5

    int global_sum = 0 ;
    pthread_mutex_t lock ;    //Declared global lock mutex object

void *print_fun(void *arg)
{
    cout<<"\nThread id : "<<(int)arg;
    pthread_mutex_lock(&lock) ; //aquiring lock on piece of code
    for ( int j=0; j<100000000; j++)
    {
        global_sum++ ;
    }
    pthread_mutex_unlock(&lock) ; //reomving lock on peice of code
    cout<<"\nGlobal Sum : "<<global_sum ;
}

int main()
{
    int i = 0 ;
    pthread_t threads_obj[MAX_NO_THREAD] ; //Initializing object array for thread
    pthread_mutex_init(&lock, NULL) ; //Initalinzing lock object for thread
    int st ;
    for ( i=0; i<5; i++)
    {
        pthread_create(&threads_obj[i], NULL, *print_fun, (void *)i) ;//Initializing threads calling function print_fun
        pthread_join(threads_obj[i], 0) ; //Forcing main thread to main until these thread complete
    }
    pthread_mutex_destroy(&lock) ; //Destroying lock object
}



//compile this program using -lpthread option with g++
//g++ thread.cc -lpthread

答案 4 :(得分:1)

也退房 Qt

答案 5 :(得分:1)

为了提供与Boost不同的建议,我使用Pthreads(或Windows上的Pthreads-Win32)。它是一个非常自己动手的准系统库,但为您提供所需的一切,而不是其他任何东西。与Boost相比,它非常轻量级,您可以轻松找到它周围的C ++包装器,为您提供更高级别的抽象。

答案 6 :(得分:1)

您也可以考虑使用openmp http://openmp.org。许多编译器都支持它,包括MS,GCC / G ++和Intel。虽然您没有明确控制线程,但它的并行性的更高级抽象有时更高效(在编码时和运行时),并且代码更容易理解。如果您正在进行GUI工作,这对您没有多大帮助,但对于可扩展计算,值得一看。

答案 7 :(得分:1)

Boost线程库可能是开始使用C ++的最佳位置。为您提供线程构造,以及编写真正有效的多线程应用程序所需的所有互斥锁和控制对象。

答案 8 :(得分:1)

在C ++ 11中,<thread>标头下引入了“线程支持库”。

可以从下面的链接中找到更多信息

https://en.cppreference.com/w/cpp/thread

http://www.cplusplus.com/reference/thread/

答案 9 :(得分:0)

如果您为了提高对不同编程模型和语言技能的了解而感兴趣,那么Boost库将是一个很好的方法。但是,对于使用多线程C ++实际构建任何生产应用程序,我会想很久很难。

C ++有时充满挑战,无需增加共享内存多线程的相当复杂性即可获得正确性。即使是经验最丰富的程序员也会同意多线程程序非常难以推理和正确。当多线程时,即使是最简单的程序也很快就会变得难以测试和调试。

诸如C ++或Java或C#等命令式语言(包含其可变变量,共享内存和锁定/信令原语)通常是尝试构建多线程应用程序的最不可接受的方式。通常有很好的单线程实现选项来完成大多数用户空间(而不是内核或嵌入式)应用程序问题,包括在多核机器上。

如果您真的想构建可靠的“多线程”应用程序,我建议您查看Erlang,Haskell,F#或Clojure等函数式语言。