Linux C 多线程【1】--简单初识
2014-03-01 16:39
253 查看
#include <pthread.h> #include <stdio.h> /* g++ -o multiThread.o multiThread.cpp -lpthread */ void* tprocess1(void* args){ int i=0; for(i=0;i<10;i++){ printf("tprocess1 %d\n",i); } return NULL; } void* tprocess2(void* args){ int i=0; for(i=0;i<100;i++){ printf("tprocess2 %d\n",i); } 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); pthread_join(t2,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吧。
PS:【pthread_join一般是主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次join所有它创建的子线程。 pthread_exit一般是子线程调用,用来结束当前线程。】
程序写好了,我们怎么编译运行它呢?
如果你使用的是Linux:
在终端里输入
g++ thread.cpp -o
thread -lpthread
./thread
就可以完成程序的编译及运行
相关文章推荐
- linux c最简单多线程例子:
- 多线程简单应用示例
- 初识php 环境的配置和简单的get post
- c++多线程编程安全性简单说明
- 初识多线程
- asp.net多线程在web页面中简单使用
- java中线程的简单的线程的多线程的一个区别
- iPhone简单的多线程调用
- linux c 简单的ls程序编写 学习笔记
- IOS -多线程 - GCD - 初识
- 最简单的多线程lua模型
- Java多线程总结(简单易懂)
- iOS 多线程之NSThread简单使用
- .Net开发中的多线程编程进行一个简单的总结
- Android开发高级进阶—多线程(实现简单下载器)
- Linux C基于Socket的多线程扫描程序
- 多线程一些简单的基础
- 八条设计多线程程序的简单规则
- java简单多线程方式+实现文件上传(spring mvc + jquery.form.js 框架)
- android 简单的多线程 通信.