第九章线程检查器-杨全胜.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章线程检查器-杨全胜.ppt

* 一些其他线程化的错误 死锁 死锁是当一个线程等待一个永远不会发生的事件的时候发生的情况 死锁的最常见原因是锁的层次 * 一些其他线程化的错误 死锁的例子 DWORD WINAPI threadA(LPVOID arg) { EnterCriticalSection(L1); EnterCriticalSection(L2); processA(data1, data2); LeaveCriticalSection(L2); LeaveCriticalSection(L1); return(0); } ThreadA: L1, then L2 DWORD WINAPI threadB(LPVOID arg) { EnterCriticalSection(L2); EnterCriticalSection(L1); processB(data2, data1); LeaveCriticalSection(L1); LeaveCriticalSection(L2); return(0); } ThreadB: L2, then L1 * 一些其他线程化的错误 另一个死锁的例子 typedef struct { // some data things SomeLockType mutex; } shape_t; shape_t Q[1024]; void swap(shape_t A,shape_t B) { lock(A.mutex); lock(B.mutex); // Swap data between A B unlock(B.mutex); unlock(A.mutex); } swap(Q[98],Q[34]); Thread 2 swap(Q[34],Q[98]); Thread 1 Grabs mutex 34 Grabs mutex 98 * 一些其他线程化的错误 线程停顿 线程停顿是指这种情况,当一个线程因为别的线程的原因而等待很长的时间 悬挂的锁能产生线程停顿。当一个线程锁住一个资源并且在线程释放资源之前由于异常而终止的时候出现悬挂的锁 ! 注意 确认线程在任何情况下(即使异常终止)都能释放所有的锁来避免死锁和线程停顿 * 一些其他线程化的错误 线程停顿 你可能希望线程在下列情况下等待: 主线程产生工作线程并在它们并发执行的末尾等待它们 线程因为同步等待在一个栅障上 * 一些其他线程化的错误 怎么错了? int data; DWORD WINAPI threadFunc(LPVOID arg) { int localData; EnterCriticalSection(lock); if (data == DONE_FLAG) return(1); localData = data; LeaveCriticalSection(lock); process(local_data); return(0); } 永远没有释放的锁 * 一些其他线程化的错误 活动2: 识别和定位死锁 目标: 寻找实际的和潜在的死锁并确定使用Intel? Thread Checker定位错误 讨论的问题: 任何线程软件开发需要什么样的创建(build)选项? 什么样的创建选项被要求用来创建二进制和源码检测指令? * 内容 什么是Intel? Thread Checker 使用Intel? Thread Checker 检测竞争条件 Thread Checker作为线程化助手 一些其他的线程化错误 检查库的线程安全性 Thread Checker的其他特性 * 检查库的线程安全性 理解线程安全性 一个代码样本或例程是线程安全的,如果多个线程试图同时执行它的时候它的功能保持正确 要测试线程安全性,完成下面的工作: Intel? Thread Checker中使用OpenMP模拟来确定任何潜在的冲突 使用OpenMP子句在多个线程中产生并行执行 * 检查库的线程安全性 例子 – 检查线程安全性 在以下两者间检查安全问题: routine1()的多个实例 routine1()和routine2()实例 设置子句来测试所有的排列 依然需要提供数据集来使用代码的相应部分 #pragma omp parallel sections { #pragma omp section routine1(data1); #pragma omp section routine1(data2); #pr

文档评论(0)

youbika + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档