- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验九_POSIX线程机制一
实验九 POSIX线程机制一
实验目的:
理解进程与线程的区别;
实现单线程与多线程控制了解线程机制
实验内容:实验步骤:(一)“hello world”单线程程序
图 1所示,观察输出结果,并分析原因。
//hello world单线程程序
# include stdio.h
const NUM = 5;
int main()
{
// void p_msg(char *);
p_msg(hello);
p_msg(world\n);
} void p_msg(char *m)
{
int i;
for(i = 0 ; i NUM ; i ++)
{
printf(%s,m);
fflush(stdout);
sleep(1);
}
}
图 1 单线程程序p_msg(hello),后运行p_msg(world\n),故先输出5个hello,1个world跟在后面,4个world换行回车。
(二)使用pthread_create创建线程
如果希望一个程序能同时执行很多函数,它创建多个线程,只要将上面的程序做两个小的改动,即可让程序执行两个函数。2中的程序是一个简单hello world”多线程程序。#include stdio.h
#include pthread.h
main()
{
pthread_t t1 , t2;
void *p_msg(void *);
pthread_create(t1,NULL,p_msg,(void * )hello );
pthread_create(t2,NULL,p_msg,(void * )world\n);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
} void *p_msg(void *m)
{
int i;
for(i = 0 ; i 5 ; i ++)
{
printf(%s,m);
fflush(stdout);
sleep(1);
}
return NULL;
} 图 2 多线程程序
提示:POSIX标准族中包含有线程标准,有关的系统调用名字以“pthread_”打头。为了使用这些函数,须对_REENTRANT宏进行定义,该宏包括在头文件pthread.h中,链接这些线程函数库时要使用编译器命令的“-lpthread”选项。
思考:
编译连接通过后,多次运行程序,查看输出结果。pthread_create(t1,NULL,p_msg,(void * )hello);
pthread_create函数的作用是创建一个线程,其原型如下:
int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg);
参数thread:如果创建线程成功,标识本线程的唯一标识符通过本变量返回给函数调用者;
参数attr:调用者通过该参数描述期望创建的线程具有什么样的属性,传入NULL表示使用默认属性;
参数start_routine:线程的运行实体;
参数arg:传递给线程实体的参数;
返回值:0成功,非0为错误码;
pthread_join函数的作用是什么?尝试将pthread_join删除,或将pthread_join换成pthread_exit,观察运行结果的变化。
实例:pthread_join(t1,NULL);
pthread_join函数的作用是等待另外某一个线程结束,其原型如下:
int pthread_join(pthread_t th, void **thread_return);
参数th:描述等待哪一个线程结束,其取值为pthread_create函数第一个参数的返回值;
参数thread_return:被等待线程结束时的返回值,等于pthread_exit函数的参数;
改为pthread_exit后结果无变化:
将pthread_join删除后:
会这样是因为两个线程在sleep(1)的时间里进程运行完毕结束。线程被迫结束。
进程放后台运行,用ps观察进程状态,用pstree观察是否有子进程产生。
没有子进程产生
改写代码,使同样的输出内容由并发的父子进程实现。进程放后台运行,用ps观察进程状态。与先前的观察有什么不同?请分析原因,体会进程和线程概念的差异。
test3.c
#include stdio.h
const NUM = 5;
int main()
{
// void p_msg(char *);
int p1;
while((p1=fork())==-1);
if(p10)
{ /*
文档评论(0)