c线程死锁范例word范文模板 25页Word文档格式.docx

上传人:b****3 文档编号:16362295 上传时间:2022-11-23 格式:DOCX 页数:20 大小:23.78KB
下载 相关 举报
c线程死锁范例word范文模板 25页Word文档格式.docx_第1页
第1页 / 共20页
c线程死锁范例word范文模板 25页Word文档格式.docx_第2页
第2页 / 共20页
c线程死锁范例word范文模板 25页Word文档格式.docx_第3页
第3页 / 共20页
c线程死锁范例word范文模板 25页Word文档格式.docx_第4页
第4页 / 共20页
c线程死锁范例word范文模板 25页Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

c线程死锁范例word范文模板 25页Word文档格式.docx

《c线程死锁范例word范文模板 25页Word文档格式.docx》由会员分享,可在线阅读,更多相关《c线程死锁范例word范文模板 25页Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

c线程死锁范例word范文模板 25页Word文档格式.docx

pthread_mutex_ts3;

//线程互斥信号量,对应A路段

pthread_mutex_ts4;

//线程互斥信号量,对应D路段

inti;

void*s(void*a1)//南边来的汽车的线程执行体

{

intserialNum=*((int*)a1);

//取当前汽车序号

pthread_mutex_lock(&

s1);

printf("

S%denterC\n"

serialNum);

sleep

(2);

pthread_mutex_unlock(&

s2);

S%denterB\n"

s3);

S%denterA\n"

S%dleaveA\n"

!

Sfinishedone\n"

);

}

void*e(void*a2)//东边来的汽车

intserialNum=*((int*)a2);

E%denterB\n"

E%denterA\n"

s4);

E%denterD\n"

E%dleaveD\n"

Efinishedone\n"

void*w(void*a3)//西边来的汽车

intserialNum=*((int*)a3);

W%denterD\n"

W%denterC\n"

W%dleaveC\n"

Wfinishedone\n"

intmain(intargc,char*argv[])

intc;

Pleaseinputtheintegernumber,lessthan7:

"

//车流量scanf("

%d"

&

c);

if(c>

Max)

Youenterthewrongnumber,tryagain.\n"

exit

(1);

inti1=pthread_mutex_init(&

s1,NULL);

//线程互斥信号量创建及初始化if(i1!

=0)

Createerror."

inti2=pthread_mutex_init(&

s2,NULL);

if(i2!

inti3=pthread_mutex_init(&

s3,NULL);

if(i3!

inti4=pthread_mutex_init(&

s4,NULL);

if(i4!

for(i=1;

i<

=c;

i++)

int*iaddr=&

i;

//汽车序号

pthread_create(&

W[i-1],NULL,(void*)w,(void*)iaddr);

//创建线程pthread_create(&

E[i-1],NULL,(void*)e,(void*)iaddr);

S[i-1],NULL,(void*)s,(void*)iaddr);

sleep(5);

for(i=0;

i<

c;

pthread_join(W[i],NULL);

//当前线程等待W[i]线程终止

pthread_join(E[i],NULL);

pthread_join(S[i],NULL);

exit(0);

//main进程结束

程序运行结果:

篇二:

死锁,死锁的预防,Linux线程控制。

操作系统实验报告

姓名:

学号:

年级:

专业:

指导教师:

1.实验目的

理解死锁,理解死锁的预防,理解Linux线程控制。

2.实验环境

Ubuntu8.0

3.实验内容

3.1Linux线程说明

Linux的线程有两种,一种内核线程,一种用户线程。

通常使用pthread线程库管理用户线程。

线程管理库专门为每一个进程构造一个管理线程,负责处理线程相关的管理工作。

当进程第一次调用pthread_create()创建一个线程时,就会创建并启动管理线程。

(1)创建线程

intpthread_create(pthread_trestricttidp,constpthread_attr_t*restrictattr,void*(*start_rtn)(void),void*restrictarg)

tidp为指向线程标识符的指针,attr为线程属性,start_rtn为线程执行函数,arg为其参数。

(2)线程互斥信号量(用于临界资源访问)的创建及其初始化

intpthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t*mutexattr)

mutex为指向互斥信号量的指针,mutexattr为信号量属性。

(3)线程互斥信号量的申请

intpthread_mutex_lock(pthread_mutex_t*mutex)

mutex为指向互斥信号量的指针

(4)线程互斥信号量的释放

intpthread_mutex_unlock(pthread_mutex_t*mutex)

(5)编译包含pthread线程的源程序,要加上-lpthread,因为pthread库不是Linux系统库。

如:

gcc–omycodemycode.c-lpthread

3.2实验要求:

下面实例可能会发生死锁。

要求修改实例,预防死锁发生。

本程序模拟十字路口汽车交通状况。

道路见下图,有四段路A、B、C、D,每段路一次只允许一辆车通过。

实验代码:

void*s(void*a1)//南边来的汽车的线程执行体

//车流量scanf("

//线程互斥信号量创建及初始化if(i1!

篇三:

进程线程及死锁的实验

实验1Linux基本命令

实验2进程

2.1实验目的

通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX规范中fork和kill系统调用的功能和使用。

2.2实验要求

2.2.1实验环境要求

1.硬件

(1)主机:

PentiumIII以上;

(2)内存:

128MB以上;

(3)显示器:

VGA或更高;

(4)硬盘空间:

至少100MB以上剩余空间。

2.软件

Linux操作系统,内核2.4.26以上,预装有X-Window、vi、gcc、gdb和任

意web浏览器。

2.2.2学生实验前的准备工作

学习man命令的用法,通过它查看fork和kill系统调用的在线帮助,并阅读参

考资料,学会fork与kill的用法。

复习C语言的相关内容。

2.3实验内容

通读下列代码:

/*

*POSIX下进程控制的实验程序残缺版

*/

#include<

sys/types.h>

signal.h>

ctype.h>

/*允许建立的子进程个数最大值*/

#defineMAX_CHILD_NUMBER10

/*子进程睡眠时间*/

#defineSLEEP_INTERVAL2

intproc_number=0;

/*子进程的自编号,从0开始*/

voiddo_something();

main(intargc,char*argv[])

intchild_proc_number=MAX_CHILD_NUMBER;

/*子进程个数*/

inti,ch;

pid_tchild_pid;

pid_tpid[10]={0};

/*存放每个子进程的id*/

if(argc>

1)

/*命令行参数中的第一个参数表示建立几个子进程,最多10个*/

child_proc_number=atoi(argv[1]);

child_proc_number

=(child_proc_number>

10)?

10:

child_proc_number;

for(i=0;

i<

child_proc_number;

/*在这里填写代码,建立child_proc_number个子进程

*子进程要执行

*proc_number=i;

*do_something();

*父进程把子进程的id保存到pid[i]*/

/*让用户选择杀死哪个进程。

输入数字(自编号)表示杀死该进程

*输入q退出*/

while((ch=getchar())!

='

q'

if(isdigit(ch))

/*在这里填写代码,向pid[ch-'

0'

]发信号SIGTERM,

*杀死该子进程*/

/*在这里填写代码,杀死本组的所有进程*/

return;

voiddo_something()

for(;

;

/*打印子进程自编号。

为清晰,在每个号码前加“号码+3”个空格

*比如号码是1,就打印"

1"

*/

ThisisprocessNo.%*d\n"

proc_number+3,

proc_number);

/*主动阻塞两秒钟*/

先猜想一下这个程序的运行结果。

假如运行“./process20”,输出会是什么样?

然后按照注释里的要求把代码补充完整,运行程序。

可以多运行一会儿,并在

此期间启动、关闭一些其它进程,看process的输出结果有什么特点,记录下这个结果。

开另一个终端窗口,运行“psaux|grepprocess”命令,看看process究竟启动了多少个进程。

回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。

按q退出程序再看进程情况。

2.4实验报告

回答下列问题,写入实验报告。

1.你最初认为运行结果会怎么样?

2.实际的结果什么样?

有什么特点?

试对产生该现象的原因进行分析。

3.proc_number这个全局变量在各个子进程里的值相同吗?

为什么?

4.kill命令在程序中使用了几次?

每次的作用是什么?

执行后的现象是什么?

5.使用kill命令可以在进程的外部杀死进程。

进程怎样能主动退出?

这两种退

出方式哪种更好一些?

6.把你的程序源代码附到实验报告后。

实验3线程

3.1实验目的

通过观察、分析实验现象,深入理解线程及线程在调度执行和内存空间等方面的特点,并掌握线程与进程的区别。

掌握在POSIX规范中pthread_create()函数的功能和使用方法

3.2实验要求

3.2.1实验环境要求

3.2.2学生实验前的准备工作

阅读参考资料,了解线程的创建等相关系统调用。

3.3实验内容

*POSIX下线程控制的实验程序残缺版

pthread.h>

#defineMAX_THREAD3/*线程的个数*/

unsignedlonglongmain_counter,counter[MAX_THREAD];

/*unsignedlonglong是比long还长的整数*/

void*thread_worker(void*);

intmain(intargc,char*argv[])

inti,rtn,ch;

pthread_tpthread_id[MAX_THREAD]={0};

/*存放每个线程的id*/for(i=0;

MAX_THREAD;

/*在这里填写代码,用pthread_create建一个普通的线程,

*线程id存入pthread_id[i],

*线程执行的函数是thread_worker,并i作为参数传递给线程*//*用户按一次回车执行下面的循环体一次。

按q退出*/

do

unsignedlonglongsum=0;

/*求所有线程的counter的和*/

sum+=counter[i];

%llu"

counter[i]);

%llu/%llu"

main_counter,sum);

篇四:

C_多线程的详细教程

Windows是一个多任务的系统,如果你使用的是windows201X及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程。

什么是进程呢?

当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源。

而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

浏览器就是一个很好的多线程的例子,在浏览器中你可以在下载JAVA小应用程序或图象的同时滚动页面,在访问新页面时,播放动画和声音,打印文件等。

多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

然而我们也必须认识到线程本身可能影响系统性能的不利方面,以正确使用线程:

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多

多线程需要协调和管理,所以需要CPU时间跟踪线程

线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题

线程太多会导致控制太复杂,最终可能造成很多Bug

基于以上认识,我们可以一个比喻来加深理解。

假设有一个公司,公司里有很多各司其职的职员,那么我们可以认为这个正常运作的公司就是一个进程,而公司里的职员就是线程。

一个公司至少得有一个职员吧,同理,一个进程至少包含一个线程。

在公司里,你可以一个职员干所有的事,但是效率很显然是高不起来的,一个人的公司也不可能做大;

一个程序中也可以只用一个线程去做事,事实上,一些过时的语言

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 其它语言学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1