第七章 同步和进程间的通信.pptVIP

  1. 1、本文档共64页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第七章 同步及进程间通信 线程同步 进程同步 进程间通信 7.1 线程同步(1) 线程同步基础 由于同一进程可包括多个线程,这些线程又共享相同的内存空间,不同的线程可以存取相同的全局变量、相同的堆数据和文件描述符等。 对于多线程非共享数据,考虑服务器的安全性问题,可采用线程专用数据TSD等方法解决。 对于多线程共享数据和进程资源时必须使用同步机制。 例如: struct employee { int id; char name[10];} 若两个线程同时修改一个结构,就可能造成数据的不一致性,必须通过同步机制予以控制。 7.1 线程同步(2) 互斥锁概念 互斥锁是提供线程同步的一种机制,是一种锁,用以保护线程代码中共享数据结构的完整性,其特点为: 对互斥锁的操作(加锁/解锁)是原子操作,操作系统保证同时只有一个线程能成功完成对一个互斥锁的加锁操作。 若一个线程已经对某一互斥锁进行了加锁,其他线程只有等待该互斥锁被解锁后,才能完成加锁操作。 若一个线程已经对某一加锁的互斥锁进行了加锁操作,该线程被挂起,待该互斥锁被解锁后,该线程被唤醒并完成加锁操作。 注意:可使用以下伪代码实现数据完整性: 加锁互斥锁 … …(修改共享变量) 解锁互斥锁 7.1 线程同步(3) 互斥锁的初始化和消除 使用互斥锁前,必须对其进行初始化;不用时,应撤消它 静态初始化方法 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 动态初始化方法 #include pthread.h int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 成功返回0,否则返回错误码 撤消互斥锁(若动态) int pthread_mutex_destroy(pthread_mutex_t *mutex); 成功返回0,否则返回错误码 7.1 线程同步(4) 加锁和解锁互斥锁 #include pthread.h 加锁函数pthread_mutex_lock() int pthread_mutex_lock(pthread_mutex_t *mutex); 成功返回0,否则返回错误码 加锁函数pthread_mutex_trylock() int pthread_mutex_trylock(pthread_mutex_t *mutex); 与pthread_mutex_lock()函数最大区别是:当试图锁定一个已被其他线程锁定的互斥锁时不阻塞,返回非零EBUSY值. 解锁函数pthread_mutex_unlock() int pthread_mutex_unlock(pthread_mutex_t *mutex); 成功返回0,否则返回错误码. 7.1 线程同步(5) 典型代码 int rc; rc=pthread_mutex_lock(a_mutex);/*加锁操作*/ if(rc) { cout“pthread_mutex_lock error”; pthread_exit(NULL); } … …/*关键代码*/ rc=pthread_mutex_unlock(a_mutex);/*解锁操作*/ if(rc) { cout“pthread_mutex_unlock error”; pthread_exit(NULL); } 7.1 线程同步(6) 实例 程序名称:mutex.cpp 功能描述:使用互斥锁。该实例包含三个线程,第1个线程反复将雇员1的记录(employee[1])拷入winner记录中,第2个线程反复将雇员2的记录(employee[2])拷入winner记录中,第3个线程(主线程)检查winner记录中的数据是否完整。 运行结果: $ ./mutex Employees contents was always consistent 结果分析: 若去掉加锁和解锁的程序行,会出现数据的不一致。 结果表明在多线程环境下,互斥锁可以保护共享数据的完整性 7.2 进程同步(1) 父子进程关系 父进程调用fork()创建子进程 子进程终止向父进程发信号SIGCHLD 进程标识与进程组 用getpid()获取本进程的ID号 用getppid()获取其父进程的ID号 用getpgrp()获取进程组的ID号(sys/types.h, unistd.h) 用int setpgid(pid_t pid,pid_t pgid)可以将一个进程加入到一个进程组中。 7.2 进程同步(2

文档评论(0)

kehan123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档