linux实验线程之双线程进行通信,实验二、线程同步与通信.ppt

实验二、线程同步与通信

实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制; 3、通过信号灯操作实现线程间的同步与互斥。 二、实验内容 通过Linux多线程与信号灯机制,设计并实现计算机线程与I/O线程共享缓冲区的同步与通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 三、预备知识 1、Linux下的信号灯及其P、V操作 在Linux中信号灯是一个数据集合,可以单独使用这一集合的每个元素。 有关的系统调用命令: 1)semget:返回一个被内核指定的整型的信号灯索引。 2)semop:执行对信号灯集的操作 3)semctl:执行对信号灯集的控制操作。 信号灯的定义: 数据结构的原型是semid_ds,在linux/sem.h中定义:struct semid_ds{ struct ipc_permsem_perm;/*permissions..seeipc.h*/ time_t sem_otime;/*last semop time*/ time_t sem_ctime;/*last change time*/ struct sem*sem_base;/*ptr to first semaphore in array*/ struct wait_queue *eventn; struct wait_queue *eventz; struct sem_undo*undo;/*undo requestson this array*/ ushort sem_nsems;/*no. of semaphores in array*/}; 信号量的创建: 使用系统调用semget()创建一个新的信号量集,或者存取一个已经存在的信号量集. 原型:int semget(key_t key,int nsems,int semflg);返回值:如果成功,则返回信号量集的IPC标识符。如果失败,则返回-1. semflg:IPC_CREAT | 0666 nsems:信号灯的个数 信号量的操作:系统调用semop();调用原型:int semop(int semid,struct sembuf *sops,unsigned nsops);返回值:0,如果成功。-1,如果失敗 struct sembuf{ushort sem_num;/*semaphore index in array*/short sem_op;/*semaphore operation*/short sem_flg;/*operation flags*/ } sem_num 将要处理的信号量的下标。 sem_op 要执行的操作。sem_flg 操作标志,IPC_NOWAIT P操作 void P(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = -1; sem.sem_flg = 0; //操作标记:0或IPC_NOWAIT等 semop(semid,&sem,1);//1:表示执行命令的个数 return; } V操作 void V(int semid,int index) { struct sembuf sem; sem.sem_num = index; sem.sem_op = 1; sem.sem_flg = 0; semop(semid,&sem,1); return; } 信号量的赋值:系统调用semctl()原型:int semctl(int semid,int semnum,int cmd,union semun arg);返回值:如果成功,则为一个正数。 参数cmd中可以使用的命令如下: ·IPC_RMID将信号量集从内存中删除。?·SETALL设置信号量集中的所有的信号量的值。?·SETVAL设置信号量集中的一个单独的信号量的值。arg.val=1; semctl(semid,1,SETVAL,arg) 2、线程 1)线程创建 pthread_create(pthread_t *thread, pthread_attr_t*attr, void *(*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含代码和文档 实验实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed! 实验 实验内容 过Linux线程与信号灯机制,设计实现计算线程与I/O线程共享缓冲区同步通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 实验实验内容 利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 实验实验内容 1、(1)Blink程序的编译和下载 (2)给Blink程序加入printf,在每次定时器事件触发点亮LED的同时通过串口显示信息 (3)修改BLink程序,只使用一个Timer,三个LED灯作为3位的进制数表示(亮灯为1,不亮为0),按照0-7的顺序循环显示,同时将数值显示在终端上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值