你能告诉我如何在C ++程序中使用线程,我怎样才能编译它,因为它将是多线程的?你能告诉我一些可以从根开始的好网站吗?
由于
答案 0 :(得分:13)
我自己没有使用它,但我被告知Boost线程库让它非常简单。
答案 1 :(得分:4)
答案 2 :(得分:3)
我使用来自intel线程构建块库的tbb_thread类。
答案 3 :(得分:1)
我使用的是我大学教授写的图书馆。它实现起来非常简单并且工作得非常好(现在使用它已经有一段时间了)。我会请求他允许与你分享。
对不起等待,但要检查:)
++++++ EDIT +++++++
好的,所以我和我的教授谈过,他不介意我在这里分享。下面是Paul Davies撰写的“RT Library”的.h和.cpp文件
http://www.filefactory.com/file/7efbeb/n/rt_h
http://www.filefactory.com/file/40d9a6/n/rt_cpp
有关线程和使用此库的一些要点:
0)本教程将介绍在Windows平台上创建和使用线程。
1)c ++中的线程通常被编码为同一源代码的一部分(与每个进程都有自己的源文件和函数main()的进程不同)
2)当进程启动并运行时,它可以通过进行适当的内核调用来创建其他线程。
3)多个线程比多个进程运行得更快,因为它们是同一进程的一部分,从而减少了操作系统的开销,并降低了内存需求。
4)在你的案例中你将使用的是rt库中的CThread类。
5)(确保rt.h和rt.cpp是“解决方案”的一部分,并确保在main.cpp中包含rt.h)
6)下面是您未来主线程的代码的一部分(当然是在main.cpp中),您将使用CThread类创建线程。
void main()
{
CThread t1(ChildThread1, ACTIVE, NULL) ;
. . .
t1.WaitForThread() ; // if thread already dead, then proceed, otherwise wait
}
顺序中t1的参数是:作为我们线程的函数的名称,线程状态(它可以是ACTIVE或SUSPENDED - 取决于你想要的),最后一个指向可选的指针您可能希望在创建时传递给线程的数据。执行一些代码后,您将需要调用WaitForThread()函数。
7)下面是您未来主线程的代码的一部分(当然是在main.cpp中),您将在其中描述子线程的作用。
UINT _ _stdcall ChildThread1(void *args)
{
. . .
}
奇怪的是有微软的线程签名。我肯定通过一些研究,你可以弄清楚如何在其他操作系统中做到这一点。参数是可以在创建时传递给子项的可选数据。
8)您可以在rt.cpp文件中找到成员函数的详细说明。以下是摘要:
CThread() - 负责创建线程的构造函数
Suspend() - 暂停子线程有效地暂停它。
Resume() - 唤醒暂停的子线程
SetPriority(int value) - 将子线程的优先级更改为该值 指定的
Post(int message) - 将消息发布到子线程
TerminateThread() - 终止或终止子线程
WaitForThread() - 暂停父线程,直到子线程终止。 如果子线程已经终止,则父级不会暂停
9)以下是示例完整程序的示例。您可以做的一件聪明的事情是创建单个线程的多个实例化。
#include “..\wherever\it\is\rt.h” //notice the windows notation
int ThreadNum[8] = {0,1,2,3,4,5,6,7} ; // an array of thread numbers
UINT _ _stdcall ChildThread (void *args) // A thread function
{
MyThreadNumber = *(int *)(args);
for ( int i = 0; i < 100; i ++)
printf( "I am the Child thread: My thread number is [%d] \n", MyThreadNumber) ;
return 0 ;
}
int main()
{
CThread *Threads[8] ;
// Create 8 instances of the above thread code and let each thread know which number it is.
for ( int i = 0; i < 8; i ++) {
printf ("Parent Thread: Creating Child Thread %d in Active State\n", i) ;
Threads[i] = new CThread (ChildThread, ACTIVE, &ThreadNum[i]) ;
}
// wait for threads to terminate, then delete thread objects we created above
for( i = 0; i < 8; i ++) {
Threads[i]->WaitForThread() ;
delete Threads[i] ; // delete the object created by ‘new’
}
return 0 ;
}
10)就是这样! rt库包含许多类,使您可以使用进程和线程以及其他并发编程技术。发现其余部分;)
答案 4 :(得分:1)
有许多线程库与c ++兼容。所以首先你必须选择一个。我更喜欢OpenMP或POSIX线程(也称为pthreads)。如何编译它取决于你选择的库。
答案 5 :(得分:0)
You may want to read my earlier posting on SO.
(事后看来,这个帖子对于pthreads来说有点片面。但我是一个Unix / Linux类型的人。这种方法在原始主题方面似乎是最好的。)
答案 6 :(得分:0)
在C / C ++中使用线程:
#include <iostream>
using namespace std;
extern "C"
{
#include <stdlib.h>
#include <pthread.h>
void *print_message_function( void *ptr );
}
int main()
{
pthread_t thread1, thread2;
char *message1 = "Thread 1";
char *message2 = "Thread 2";
int iret1, iret2;
iret1 = pthread_create( &thread1, NULL, print_message_function (void*) message1);
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
//printf("Thread 1 returns: %d\n",iret1);
//printf("Thread 2 returns: %d\n",iret2);
cout<<"Thread 1 returns: %d\n"<<iret1;
cout<<"Thread 2 returns: %d\n"<<iret2;
exit(0);
}
void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
//printf("%s \n", message);
cout<<"%s"<<message;
}