在C ++中使用线程

时间:2008-12-02 04:15:51

标签: c++ multithreading

你能告诉我如何在C ++程序中使用线程,我怎样才能编译它,因为它将是多线程的?你能告诉我一些可以从根开始的好网站吗?

由于

7 个答案:

答案 0 :(得分:13)

我自己没有使用它,但我被告知Boost线程库让它非常简单。

http://www.boost.org/doc/libs/1_37_0/doc/html/thread.html

答案 1 :(得分:4)

对于Unix / Linux / BSD,有pthread库:tutorial

我想Win32 API中有相同的内容。

答案 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;
}