查看程序的进程和线程实验报告Word文件下载.docx
- 文档编号:13239035
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:8
- 大小:15.51KB
查看程序的进程和线程实验报告Word文件下载.docx
《查看程序的进程和线程实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《查看程序的进程和线程实验报告Word文件下载.docx(8页珍藏版)》请在冰豆网上搜索。
查看程序的进程和线程实验报告) intthrd_num=(int)arg;
intdelay_time=0;
intcount=0;
printf("
Thread%disstaraing\n"
thrd_num);
for(count=0;
count {
delay_time=(int)(rand()*TIME/(RAND_MAX))+1;
sleep(delay_time);
\tTH%d:
job%ddelay=%d\n"
thrd_num,count,delay_time);
}
%dfinished\n"
pthread_exit(NULL);
intmain()
pthread_tthread[T_NUMBER];
intno=0,res;
void*thrd_ret;
srand(time(NULL));
for(no=0;
no {
res=pthread_create(&
thread[no],NULL,thrd_func,(void*)no);
if(res!
=0)
Creayth%dfaild\n"
no);
exit(res);
success\nwaiting\n"
);
for(no=0;
no {
res=pthread_join(thread[no],&
thrd_ret);
if(!
res)
t%djoined\n"
else
T%djoinedfaild\n"
return0;
4.编译、运行方法及结果(抓屏)
5.结果分析
由运行结果可以看出,创建线程、释放资源按照顺序,而每个线程的运行和结束是独立与并行的。
实验二(p287:
11-thread_mutex.c)
在试验1的基础上通过互斥锁,使原本独立,无序的多个线程能够按顺序进行
#defineTHREAD_NUMBER3/*线程数*/
#defineREPEAT_NUMBER3/*每个线程的小任务数*/
#defineDELAY_TIME_LEVELS10.0/*小任务间的最大时间间隔*/
pthread_mutex_tmutex;
void*thrd_func(void*arg)//线程函数例程
intthrd_num=(int)arg;
intdelay_time=0,count=0;
intres;
//互斥锁上锁
res=pthread_mutex_lock(&
mutex);
if(res)
篇二:
操作系统实验报告_进程和线程
计算机科学与软件学院
操作系统上机实验报告
学生姓名:
学号:
班级:
班实验日期:
实验名称:
进程和线程
实验目的:
理解unix/Linux下进程和线程的创建、并发执行过程。
实验内容:
1.进程的创建
2.多线程应用
实验步骤及分析:
(此部分为关键内容:
要求整理实验主要步骤,总结编写实验过程中遇到哪些问题,如何解决的,若未解决也应总结,回答思考题的答案)
一、进程的创建
下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。
1、实验指导
fork()
创建一个新进程。
系统调用格式:
pid=fork()
参数定义:
intfork()
fork()返回值意义如下:
0:
在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。
>
0:
在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。
-1:
创建失败。
如果fork()调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork()被调用了一次,但返回了两次。
此时OS在内存中建立一个新进程,所建的新进程是调用fork()父进程(parentprocess)的副本,称为子进程(childprocess)。
子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。
父进程与子进程并发执行。
2、参考程序代码
/*process.c*/
main(intargc,char*argv[])
intpid;
/*forkanotherprocess*/
pid=fork();
if(pid fprintf(stderr,"
ForkFailed"
exit(-1);
elseif(pid==0){/*childprocess*/
execlp("
/bin/ls"
"
ls"
NULL);
else{/*parentprocess*/
/*parentwillwaitforthechildtocomplete*/
wait(NULL);
printf("
ChildComplete"
);
exit(0);
3、编译和运行
$gccprocess.c–oprocesss
4、运行
$./process程序运行截图
5、思考
(1)系统是怎样创建进程的?
(2)扩展程序,在父进程中输出1到5,在子进程中输出6-10,要求父子进程并发
输出;
记录实验结果,并给出简单分析。
6.实验中遇到的问题和解决方法
二、多线程应用
编写unix/Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a。
下面是一个最简单的多线程程序example1.c。
1.实验指导
下面的示例中,要使用到两个函数,pthread_create和pthread_join,并声明了一个pthread_t型的变量。
函数pthread_create用来创建一个线程,它的原型为:
externintpthread_create__P((pthread_t*__thread,__constpthread_attr_t*__attr,void*(*__start_routine)(void*),void*__arg));
第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。
这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。
第二个参数我们也设为空指针,这样将生成默认属性的线程。
当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。
前者表示系统限制创建新的线程,例如线程数目过多了;
后者表示第二个参数代表的线程属性值非法。
创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。
函数pthread_join用来等待一个线程的结束。
函数原型为:
externintpthread_join__P((pthread_t__th,void**__thread_return));
第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。
这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等
待的线程结束为止,当函数返回时,被等待线程的资源被收回。
一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;
另一种方式是通过函数pthread_exit来实现。
它的函数原型为:
externvoidpthread_exit__P((void*__retval))__attribute__((__noreturn__));
唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给thread_return。
/*thread.c*/
voidthread(void)
inti;
for(i=0;
i printf("
Thisisapthread.\n"
intmain(intargc,char*argv[])
pthread_tid;
inti,ret;
ret=pthread_create(&
id,NULL,(void*)thread,NULL);
if(ret!
=0){
printf("
Createpthreaderror!
\n"
exit
(1);
Thisisthemainprocess.\n"
pthread_join(id,NULL);
return(0);
编译此程序:
gccexample1.c-lpthread-oexample1
-lpthread:
使用线程库
运行example1,得到如下结果:
Thisisthemainprocess.
Thisisapthread.
再次运行,可能得到如下结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 查看 程序 进程 线程 实验 报告