先来看一个基本的例子:
#include <pthread.h>
#include 
<stdio.h>

void* tprocess1(void* args){
         
while(1){
                 printf( 
"tprocess1");
         }

         
return NULL;
}


void* tprocess2(void* args){
         
while(1){
                 printf(
"tprocess2");
         }

         
return NULL;
}


int main(){
         pthread_t t1;
         pthread_t t2;
         pthread_create(
&t1,NULL,tprocess1,NULL);
         pthread_create(
&t2,NULL,tprocess2,NULL);
         pthread_join(t1,NULL);
         
return 0;
}


在上面的例子中,我们首先加入了pthread.h文件包含,这是所以pthread多线程程序所必须的,接着是iostream我们进行输入输出时要用到,接着就是两个函数的定义,这和普通的函数没有什么区别,之所以写成的
 程序代码
void* tprocess1(void* args)
这样的形式,完全是为了迎合pthread_create函数的参数类型,你也可以不这样定义,只要在调用pthread_create创建线程的时候强制转换一下指针类型就可以了。

这两个函数将被用做线程的执行体,也就是说在两个线程里同时运行这两个函数。

现在我们来看main函数,和pthread有关的调用都在这里了。
pthread_t是线程结构,用来保存线程相关数据,你也可以理解为是线程类型,声明一个线程对象(变量)。
 程序代码
         pthread_t t1;
         pthread_t t2;
这里我们声明了两个线程变量t1,t2

 程序代码
         pthread_create(
&t1,NULL,tprocess1,NULL);
         pthread_create(
&t2,NULL,tprocess2,NULL);
这两句非常重要,pthread_create用来创建线程并启动,他的原型是
 程序代码
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg);
我们可以知道第一个参数是线程指针,第二参数是线程属性指针,线程属性pthread_attr_t用来指定线程优先级等属性,一般的情况下,我们没有必要修改,使用默认属性来构造线程,所以这里一般取NULL,我们也是这样做的,第三个参数是一个函数指针,就是线程要执行的代码,这里我们分别要执行tprocess1 tprocess2就写成了上面的样子,这里这个函数指针的类型定义是返回一个空类型指针,接收一个空类型指针参数的函数指针,如果你的函数不是这个定义,那就可以直接转化一下就可以了。

写完这两行代码,两个线程就已经执行起来了,但是如果你省略了
 程序代码
         pthread_join(t1,NULL);
然后尝试编译运行程序的时候你会发现程序似乎什么也没干就退出了,是的,那是因为程序的主线程退出的时候操作系统会关闭应用程序使用的所有资源,包括线程……所以在main函数结束前我们得想办法让程序停下来,pthread_join方法的功能就是等待线程结束,要等的线程就是第一个参数,程序会在这个地方停下来,直到线程结束,第二个参数用来接受线程函数的返回值,是void
**类型的指针,如果没有返回值,就直接设为NULL吧。

程序写好了,我们怎么编译运行它呢?
如果你使用的是Linux:
在终端里输入
g
++ thread.cpp -othread -lpthread
.
/thread
就可以完成程序的编译及运行



摘自:http://www.cnblogs.com/lovko/archive/2009/01/15/1376032.html