如何在C++中实现多线程而不会导致可移植性问题?boost的thread库是一个好的解决方案吗?
顺便说一下,如何将多线程作为库实现?这不是编译器必须完成的事情吗?
Qt
:如果你只需要线程支持,那么它就过度了。从编译到结果的往返时间非常慢。它设计得非常好,但不像来自boost的C++0x线程那样是官方标准。因此,我不会把它作为第一选择。让我们倒过来开始:
如何在库中实现线程?
在(纯)C++ 中无法做到,这需要语言支持(编译器只是一种实现)。
目前有两种方式:
pthread
库)两者都很脆弱,并且需要大量的工作才能实现可移植性。基本上就意味着在代码中有很多 #ifdef
部分,用于测试编译器和目标架构的支持情况以及测试是否支持某些指令等等...
这就是为什么认为有必要在 C++0x 中添加线程支持。
如何进行多线程编程?
即使在选择库之前,您也应该选择一种方法。有两种编程多线程应用程序的方法(可以组合使用):
pthread
,但我建议使用 Boost.Thread
(以及其他)来实现可移植性。TBB
。您可以将两者合并,但最好不要这样做。个人认为 FastFlow 的描述非常棒:它鼓励无锁编程。此外,第二种方法的主要优点是它更适合多进程编程,并且可扩展到分布式环境。
首先,我建议专注于其中一种并构建一些应用程序。当您感到舒适时,可以尝试另一种方法,但要准备重新开始,因为它们有很大的不同。
//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
libboost_thread-vc100-mt-gd-1_43.lib
并不像是一个头文件。 - Matthieu M.*.hpp
文件)。抱歉,你是对的,那就不是那么小了……该 DLL 还带有线程和互斥类以及许多其他内容。 - jdehaan你还可以考虑使用 OpenMP http://openmp.org。许多编译器都支持它,包括 MS、GCC/G++ 和 Intel。尽管你没有对线程的显式控制,但它更高级抽象的并行性有时更有效(无论是在编码时间还是运行时),而且代码更易于理解。如果你在做 GUI 工作,这对你帮助不大,但对于可扩展计算来说,它值得一看。
如果您出于兴趣来提高不同编程模型和语言技能的知识,那么Boost库是一个很好的选择。然而,我认为在实际构建任何生产应用程序时使用多线程C++需要仔细考虑。
C++有时候已经具有挑战性,要想正确无误地完成任务,就不要增加共享内存多线程的相当复杂性。即使是最有经验的程序员也会同意,多线程程序极其难以理解和正确实现。即使是最简单的程序,在多线程情况下也很快变得难以测试和调试。
命令式语言(如C++、Java或C#)通常是尝试构建多线程应用程序的最不可接近的方式,因为它们具有可变变量、共享内存和锁定/信号原语。通常有完全可以胜任大多数用户空间(而非内核或嵌入式)应用程序问题的单线程实现选项,包括在多核机器上。
如果您真的想要构建可靠的“多线程”应用程序,我建议您查看像Erlang、Haskell、F#或Clojure这样的函数式语言。