运行一两次可能没问题,但运行几万次可能会出现问题,此bug老师给我指出的,程序还有待优化。
1.4 源代码
1:
#include
第 4 页
int i; p(mutex,0); printf(\窗口2:本航班共有%d个座位,请问您需要买几张?\\n\ scanf(\ if(i>ticket) printf(\窗口2:剩余票数不够\ else ticket=ticket-i; v(mutex,0); } void thread3(void) { int i; p(mutex,0); printf(\窗口3:本航班共有%d个座位,请问您需要买几张?\\n\ scanf(\ if(i>ticket) printf(\窗口3:剩余票数不够\ else ticket=ticket-i; v(mutex,0); } int main() { pthread_t id1,id2,id3; int ret1,ret2,ret3; union semun arg; mutex =semget(IPC_PRIVATE,IPC_CREAT); arg.val = 1; semctl(mutex,0,IPC_RMID,0); ret1=pthread_create(&id1,NULL,(void*)thread1,NULL); ret2=pthread_create(&id2,NULL,(void*)thread2,NULL); ret3=pthread_create(&id3,NULL,(void*)thread3,NULL); if(ret1!=0){ printf(\ exit(1); } if(ret2!=0){ printf(\ exit(1); } if(ret3!=0){ printf(\ exit(1); } pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_join(id3,NULL); 1
第 5 页
return 0; } 2:
#include
第 6 页
semctl(m,1,SETVAL,arg); ret1=pthread_create(&id1,NULL,(void*)pa,NULL); if(ret1!=0){ printf(\exit (1); } printf(\ret2=pthread_create(&id2,NULL,(void*)pb,NULL); if(ret2!=0){ printf(\exit (1); } printf(\ pthread_join(id1,NULL); pthread_join(id2,NULL); return 0; }
实验二 Linux进程及同步
2.1 实验目的与内容
2.1.1 实验目的
了解并掌握Linux进程及同步 2.2.2 实验内容
编程模拟实现誊抄; 创建三个誊抄进程; 基于共享内存建立缓冲区; 创建同步信号灯;
对各誊抄进程施加P、V操作;
2.2 实验过程 2.2.1 预备知识
①并发程序的誊抄:
1
第 7 页
get程序:负责从输入序列f中读取字符并送到缓冲区s中; copy程序:把缓冲区s中的数据复制到缓冲区t中去; put程序:从缓冲区t中取出数据打印;
②誊抄的实现:
在相应的圆圈对应的进程中,通过修改箭头上对应序号的信号灯控制进程的运行,设有4个信号灯分别为0、1、2、3
在进程中对信号灯的控制可简写为: get() copy() put() { { { p(0); p(1); p(3); p(2); get操作; put操作; copy操作; v(2); v(1); } v(0); } v(3); } 通过设置信号灯0的初值和利用通过设置信号灯1、2的初值和利通过设置信号灯3的初值和利用copy对信号灯0做v操作,使得用put对信号灯1做v操作、利用copy对信号灯3做v操作,使得当信号灯0的资源个数>0时,可get对信号灯2做v操作,使得当当信号灯3的资源个数>0时,可以进行get操作 信号灯1和信号灯2的资源个数以进行put操作 均>0时,可以进行copy操作
2.2.2 实验测试与结果
运行结果:
1
第 8 页