实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步.

Slides:



Advertisements
Similar presentations
© 2005 博创科技 北 京 博 创 兴 业 科 技 有 限 公 司 BEIJNG UNIVERSAL PIONEERING TECHNOLOGY Co., LTD 博创科技 嵌入互动 第四讲 Linux 多线程编程 北京博创兴业科技有限公司.
Advertisements

1 基于嵌入式 Linux 开发基础 丁男. 2 概要 基于 linux 系统开发简介 基于 linux 系统开发简介 多线程技术 多线程技术 对文件操作 对文件操作 对设备操作 对设备操作.
阻塞操作. 在 linux 里,一个等待队列由一个 wait_queue_head_t 类型的结构来描述 等待队列的初始化: static wait_queue_head_t testqueue; init_waitqueue_head(&testqueue);
多线程编程  Linux 下线程 概述  linux 线程 实现. 1 、 Linux 下线程 概述 进程是系统中程序执行和资源分配的基 本单位。每个进程有自己的数据段、代码 段和堆栈段。 线程通常叫做轻型的进程。线程是在共 享内存空间中并发执行的多道执行路径, 他们共享一个进程的资源。 因为线程和进程比起来很小,所以相对.
如何準備校務評鑑— 校方處室觀點 土城國小輔導處主任 林德姮.
中低收入老人生活津貼 中低收入老人生活津貼SOP 應計人口 申請人及其配偶。 負有扶養義務之子女及其配偶。 前款之人所扶養之無工作能力子女。
實施勞退金提撥專案檢查 查核資料說明 報告人:徐維聰.
新北市廠商聯合抗旱會議 104年3月23日.
香港普通話研習社科技創意小學 周順強老師.
Oracle数据库 Oracle 子程序.
第一章 c语言程序设计基础 任课教师:温荷 Neusoft Institute of Information
友達光電廠顯影液儲槽事故案 (資料來源:蘋果日報)
第一類學校輔導訪視流程SOP 104年度區域防災及氣候變遷調適 教育服務推廣團計畫 北區防災教育服務團執行,中區與南區服務團協辦
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
專題講座 『圖書館學生志工服務簡介』 主講人:朱嫺玢 國立雲林科技大學圖書館 館務發展組組長 國家考試-圖書博物管理職系
第三讲 多线程程序设计 课程网站:CourseGrading buaa.edu.cn 主讲教师: 赵长海
Using C++ The Weird Way Something about c++11 & OOP tricks
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
chapter 1-Introduction
多进程编程.
进程及进程管理 第4章 进程及进程管理.
实验、进(线)程同步与通信 一、实验目的 1、掌握Linux系统用户界面中键盘命令的使用。 2、学会一种Linux下的编程环境。
实践演练 广州创龙电子科技有限公司 01 广州创龙电子科技有限公司
走进编程 程序的顺序结构(二).
辅导课程六.
临界区软件互斥软件实现算法.
中国科学技术大学计算机系 陈香兰(0512- ) Autumn 2010
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
本节内容 模拟线程切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
实验三 使用Linux高级IPC 陈毅东.
第七章 操作符重载 胡昊 南京大学计算机系软件所.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第一章 函数与极限.
实验二、线程同步与通信 一、实验目的 1、掌握Linux下线程的概念; 2、了解Linux线程同步与通信的主要机制;
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
$9 泛型基础.
实验三、共享内存与进程同步 一、实验目的 1、掌握Linux下共享内存的概念与使用方法; 2、掌握环形缓冲的结构与使用方法;
实验三、共享内存与进程同步 一、实验目的与要求 二、实验内容
C语言环境配置.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
第二章 Java基本语法 讲师:复凡.
姚金宇 MIT SCHEME 使用说明 姚金宇
3.5 线程 问题的提出 进程的引入使操作系统得以完成对并发执行的多道程序动态特征的描述和资源共享的管理,因而进程既是调度的基本单位又是资源分配的基本单位。进程所具有的这两个特点构成了程序并发执行的基础,但同时又导致进程切换过程中由于进程映像过大而带来的时空开销。因此,如果系统中创建的进程过多,或进程切换的频率过高,则会使系统效率下降,限制了并发度的进一步提高。
Select模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
信号量(Semaphore).
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
3.16 枚举算法及其程序实现 ——数组的作用.
第二章 类型、对象、运算符和表达式.
Pthread.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
教育部特殊教育通報網 學生異動、接收操作說明.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
WSAAsyncSelect 模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
_07多连接之select模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
阻塞式模型 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第6章 嵌入式软件开发基础.
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab10 1.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab11 1.
本节内容 SEMAPHORE 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
本节内容 this指针 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
2019 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A Lab7.
《操作系统设计与实现》 Linux系统编程.
Presentation transcript:

实验二 Linux 线程及信号灯 一、目的 了解并掌握 Linux 线程及信号灯。 二、要求 1 、了解 Linux 线程与信号灯使用: ( 1 ) Linux 线程 ( 2 ) Linux 信号灯 ( 3 )线程互斥 ( 4 )线程同步

三、内容 1 、熟悉 Linux 线程接口及连接; 2 、了解 Linux 信号灯的编程; 3 、编程模拟实现飞机售票; 创建多个售票线程; 已售票使用公用全局变量; 创建互斥信号灯; 对售票线程临界区施加 P 、 V 操作。

4 、编程模拟实现双线程单缓冲 区的合作; 创建多个计算线程与输出线程; 创建同步信号灯; 缓冲区用全局公用数组变量; 对计算线程与输出线程施加 P 、 V 操作。

四、预备知识 1 、线程接口 线程创建 int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg)); 参数: __thread 指向返回线程标识符的指针 ; __attr 设置线程属性 ; __start_routine 线程运行函数地址 ; __arg 运行函数的参数 。

当创建线程成功时,函数返回 0 , 若不为 0 则说明创建线程失败,常见的 错误返回代码为 EAGAIN 和 EINVAL 。 前者表示系统限制创建新的线程,例如 线程数目过多了;后者表示第二个参数 代表的线程属性值非法。创建线程成功 后,新创建的线程则运行参数三和参数 四确定的函数,原来的线程则继续运行 下一行代码。

线程等待:等待一个线程的结束 int pthread_join __P ((pthread_t __th, void **__thread_return)); __th 被等待的线程标识符, __thread_return 为一个用户定义的指针, 它可以用来存储被等待线程的返回值。这个函 数是一个线程阻塞的函数,调用它的函数将一 直等待到被等待的线程结束为止,当函数返回 时,被等待线程的资源被收回。

线程撤消: void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__)); 唯一的参数是函数的返回代码,只要 pthread_join 中的第二个参数 thread_return 不是 NULL ,这个值将被传递给 thread_return 。最 后要说明的是,一个线程不能被多个线程等 待,否则第一个接收到信号的线程成功返回, 其余调用 pthread_join 的线程则返回错误代码 ESRCH 。

/ * 线程示例 */ # include # include void thread(void) { int i; for(i=0;i<3;i++) printf("This is a pthread.\n"); } int main(void) { pthread_t id; int i,ret; ret=pthread_create(&id,NULL,(void *) thread,NULL); if(ret!=0){ printf ("Create pthread error!\n"); exit (1); } for(i=0;i<3;i++) printf("This is the main process.\n"); pthread_join(id,NULL); return (0); } 运行结果 1 This is the main process. This is a pthread. This is the main process. This is the main process. This is a pthread. This is a pthread. 运行结果 2 This is a pthread. This is the main process. This is a pthread. This is the main process. This is a pthread. This is the main process. #gcc example1.c -lpthread -o example1

2 、 System V 信号灯 创建一信号灯集: int semget(key_t key,int nsems,int semflg) key 是一个关键字 ,为 IPC_PRIVATE 表明由系统 选用一个关键字; nsems 创建的信号灯个数,信号灯编号为 0 到 nsems-1 ; semflg 创建的权限标志,如 IPC_CREAT|0666 ; /*IPC_CREAT 表示不存在则创建 */ 成功时返回信号灯的 ID ,否则为 -1 。

信号灯控制 int semctl(int semid,int semnum,int cmd,union semun arg) semid 是要操作的信号灯集 ID ; semnum 是信号灯集中信号灯的编号; cmd 是操作的命令,常用 SETVAL( 设置信号量 的值 ) 和 IPC_RMID( 删除信号灯 ) arg 给 cmd 的参数。 arg.val = 1; res = semctl(semid,0,SETVAL,arg); semctl(semid,0,IPC_RMID,0)

信号灯操作: int semop(int semid,struct sembuf *spos,int nspos) semid 是要操作的信号灯集 ID ; spos 操作数组, nspos 表明数组的个数 。 struct sembuf { short sem_num; /* 使用那一个信号灯 */ short sem_op; /* 进行什么操作 */ short sem_flg; /* 操作的标志,置为 0 ; */ /*IPC_NOWAIT — 不挂起、 SEM_UNDO — 退出还原 */ };

sem_op > 0 :将 sem_op 加入到信号灯的值 中, 并唤醒等待信号灯增加的进程; sem_op = 0 :当信号灯的值是 0 的时候, 函 数返回, 否则阻塞直到信号灯的值为 0 ; sem_op < 0 :函数判断信号灯的值加上这 个负值, 结果为 0 唤醒等待信号灯为 0 的 进程, 如果小于 0 函数阻塞,如果大于 0, 那 么从信号于里面减去这个值并返回。

对应信号灯 P 操作实现: Void P(int semid,int semno) { struct sembuf sop; sop.sem_num = semno; sop.sem_op = -1; sop.sem_flg = 0; semop(semid,&sop,1); }

对应信号灯 V 操作实现: Void V(int semid,int semno) { struct sembuf sop; sop.sem_num = semno; sop.sem_op = 1; sop.sem_flg = 0; semop(semid,&sop,1); }

程序结构: main() { 创建信号灯集; 设置互斥 / 同步信号灯初值; 创建子线程; 同步等待子线程退出; 撤消信号灯集; }