C语言使用pthread多线程编程(windows系统)二

咱们进行多线程编程,能够有多种选择,可使用WindowsAPI,若是你在使用GTK,也可使用GTK实现了的线程库,若是你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,个人程序是在Linux下写的,因此我使用了Pthread库(是否是很伤心,我知道有很多人期待的是WindowsAPI的,好吧,有机会之后再讲那个,如今先把这一系列专题写完 ^_^

若是你用的是LINUX
/UNIX/MacOSX,那么咱们已经能够开始了,若是你用的是WINDOWS,那么你须要从网站上下载PTHREAD的WINDOWS开发包,所幸他很是的小。网站地址是http://sourceware.org/pthreads-win32/

先来看一个基本的例子:
 程序代码
#include 
<pthread.h>
#include 
<iostream>

using namespace std;

void* tprocess1(void* args){
         
while(1){
                 cout 
<< "tprocess1" << endl;
         }
         
return NULL;
}

void* tprocess2(void* args){
         
while(1){
                 cout 
<< "tprocess2" << endl;
         }
         
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,咱们也是这样作的,第三个参数是一个函数指针(函数指针?什么东西,没据说过啊?……巨晕,好嘛,你复习一下C或是C++指针那部分吧)就是线程要执行的代码,这里咱们分别要执行tprocess1 tprocess2就写成了上面的样子,这里这个函数指针的类型定义是返回一个空类型指针,接收一个空类型指针参数的函数指针,若是你的函数不是这个定义,那就能够直接转化一下就能够了。

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

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

若是你用的是VC:
在工程属性里加入开发包里的几个库文件
把那几个DLL文件放到你的工程路径里,也就是程序运行时候的工做路径,这个在VC6和2005里彷佛不太同样,若是你不肯定,那就直接放到SYSTEM32里吧。。。
下面的工做就很是简单了
点运行,提示编译,就肯定,好了,结果出来了。。。

是否是感受多线程如此的简单,短短几行代码就搞定了,我想你已经能够写出一个简单的多线程程序了吧,呵呵,其实问题没有这么简单,多线程咱们还要面对线程同步的问题,我会在下一个专题里给你们讲到。  
html

出处:http://www.cnblogs.com/lovko/archive/2009/01/15/1376032.htmlios

相关文章
相关标签/搜索