资源描述:
《跟我学linux编程-8-多线程简单示例》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、多线程编程简单示例今天,我们将写一个简单的多线程示例程序,来做为我们多线程学习的初步开始。先上例子再做解释:#include#include//线程执行函数void*thread_task(void*arg){intid=(int)arg;intcnt=0;while(1){printf("[%d]:%d",id,cnt);cnt++;sleep(1);}returnNULL;}intmain(intargc,char*argv[]){pthread_tthr;//创建两个线程pthread_create(&thr,NULL,thread_task
2、,(void*)1);pthread_create(&thr,NULL,thread_task,(void*)2);thread_task((void*)0);return0;}写多线程程序,有如下几个要点:1#include,多线程编程相关的库函数需引用这个头文件。2为每个线程写一个线程执行函数(线程任务逻辑相同,可以使用同一个线程执行函数),如示例中的pthread_task,就是线程执行函数。线程执行函数的形式为:void*task(void*arg);其返回值为void*,参数也为void*。如果多个线程使用同一个线程执行函数,那么arg参数是一个能够用于实际区
3、分这些线程任务的重要内容。3调用phread_create接口,创建每一个线程,并为其指定线程执行函数以及参数。其接口定义为:intpthread_create(pthread_t*tidp,constpthread_attr_t*attr,(void*)(*start_rtn)(void*),void*arg);其中:tidp是线程对像,由调用者指定,用于返回线程编号;attr是线程参数,如线程优先级等,我们通常设置为NULL;start_rtn为线程执行函数,线程创建后,调用start_rtn,start_rtn运行结束,线程也就终止;arg为线程执行函数的参数,pthread_crea
4、te本身并不使用,只是简单将其传给start_rtn。4编译程序时,需链接pthread动态库。我们的示例程序源码为thread.c,编译生成的目标文件为thread,则gcc编译命令为:gccthread.c–othread-lpthread其中,-l表连接动态库,其后边跟动态库名称。示例程序顺利通过编译后,运行,我们将会看到程序不断在屏幕上交替打印记数器。其输出结果类似(注意只是类似)为:[1]:0[2]:0[0]:0[1]:1[2]:1[0]:1[1]:2[2]:2[0]:2[1]:3[0]:3[2]:3…我们来对代码进行分析,本例子中,函数thread_task为线程执行函数。它的功
5、能非常简单:维护一个记数器,每秒将其加一,并在屏幕上将其值打印出来。为了区分是那个线程打印的,我们为每个线程指定了一个编号,其编号通过线程执行函数的参数给定,因于线程执行函数的参数只能是void*类型,因此,在创建线程的时候,我们先将整数转化成void*类型,见主函数代码:pthread_create(&thr,NULL,thread_task,(void*)1);将1强制转化成void*,然后再在线程执行函数中,又将void*强制转化成int,实现了数据的还原,见thread_task函数代码第一行:intid=(int)arg;主函数中,我们调用pthread_create创建了两个线程
6、:pthread_create(&thr,NULL,thread_task,(void*)1);pthread_create(&thr,NULL,thread_task,(void*)2);两个线程的执行函数都是thread_task,但给的参数不相同(一个是(void*)1,一个是(void*)2),因此thread_task中能够输出不同的id,这是多个线程共用一个线程函数却做不同事情(程序逻辑一致,但处理对像不同)的实现方法。实事上,程序输出的信息中,有三组不同编号的打印,这是因为主函数也调用了thead_task函数,并指定编号为0:thread_task((void*)0);示例这
7、么写,并不是说主函数要调用线程执行函数,这两者之前没有必然联系。示例的真正目的有如下几个:1线程执行函数并不是什么特殊的函数,可以做为pthread_create的start_rtn参数被线程调用,也可以被普通函数所调用。2告诉大家,多线程程序中,除由pthread_create创建线程外,还隐式地创建了一个主线程,我们的main函数就是在主线程中执行的,因此示例程序虽然只用ptread_create创建了两