c线程死锁范例word范文模板 25页Word文档格式.docx
《c线程死锁范例word范文模板 25页Word文档格式.docx》由会员分享,可在线阅读,更多相关《c线程死锁范例word范文模板 25页Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
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
基于以上认识,我们可以一个比喻来加深理解。
假设有一个公司,公司里有很多各司其职的职员,那么我们可以认为这个正常运作的公司就是一个进程,而公司里的职员就是线程。
一个公司至少得有一个职员吧,同理,一个进程至少包含一个线程。
在公司里,你可以一个职员干所有的事,但是效率很显然是高不起来的,一个人的公司也不可能做大;
一个程序中也可以只用一个线程去做事,事实上,一些过时的语言