二、高级线程同步

如果线程访问共享资源或者等待一些特殊事件的发生,如果共享资源可用或特殊事件已发生则函数返回同时该进程保持可调度状态,否则该线程处于等待状态。系统将处于等待状态的线程不占用系统资源(不浪费CPU时间),当资源可用或特殊事件发生时将线程处于可调度状态,该线程与资源或特殊事件保持同步。

应该避免一个线程(通过不断查询多个线程共享或可以访问的变量的状态)与另一个线程中的任务的完成实现同步

三、关键代码段

关键代码段(又叫临界区),即通过一小段代码使进程对共享资源以独占的方式进行访问,让该段代码能以原子操作的方式访问共享资源的一种方法。通过CRITICAL_SECTION结构(临界对象)实现互斥。关键代码的主要缺点是无法用它们对多个进程中的各个线程进行同步。

  1. 关键代码段描述

关键代码段实现步骤

1)InitializeCriticalSection 初始化临界代码段

2)EnterCriticalSention 临界代码段,拥有临界区对象所有权

3)LeaveCriticalSection  离开.....,放弃临界区对象所有权

4)DeleteCriticalSection 删除.....

VOID InitializeCriticalSection (PCRITICAL_SECTION pcs);

对(p c s指向的)CRITICAL_SECTION结构的各个成员进行初始化。

VOID EnterCriticalSection(PCRITICAL_SECTION pcs);

用于查看结果中的变量以确定临界资源是否可以以互斥的方式进行访问,如果没有别的线程互斥的访问该资源则更新变量,获得该资源的访问权。如果该资源正在被其他线程访问则将调用该函数的线程处于置于等待状态,一旦占有该资源的线程释放该资源就将调用线程置于可调度状态。

VOID LeaveCriticalSection(PCRITICAL_SECTION pcs);

查看该结构中的成员变量。该函数每次计数时要递减1,以指明调用线程多少次被赋予对共享资源的访问权。如果计数大于0,不做任何操作返回。如果计数为0,查看在调用EnterCriticalSention中是否有别的线程正在等待。如果有就更新成员变量,并使等待线程中的一个线程处于可调度状态。

VOID DeleteCriticalSection(PCRITICAL_SECTION pcs);

对(p c s指向的)CRITICAL_SECTION结构的各个成员进行删除。

第八章 用户方式中线程的同步(2)相关推荐

  1. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

  2. Windows核心编程 第八章 用户方式中线程的同步(下)

    8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...

  3. 用户方式中线程的同步——Windows核心编程学习手札之八

    用户方式中线程的同步 --Windows核心编程学习手札之八 系统中所有线程都必须拥有对各种系统资源的访问权,这些资源包括内存堆栈.串口.文件.窗口和许多其他资源.如果一个线程需要独占对资源的访问权, ...

  4. Windows编程-- 用户方式中线程的同步---关键代码段(临界区)

    可以从例子学习,更好的掌握 #include <windows.h> #include <iostream.h> //两个线程的声明 DWORD WINAPI Fun1Proc ...

  5. java 两个线程同步_Java 多线程(二)—— 线程的同步

    实现Runnable接口 public classTestThread2 {public static voidmain(String [] args){ Window window=newWindo ...

  6. Java 多线程(二)—— 线程的同步

     上文创建多线程买票的例子中注释会出现错票.重票的问题,本文来讲讲如何解决此问题.本文例子:利用多线程模拟 3 个窗口卖票 实现Runnable接口 public class TestThread2 ...

  7. 关于C语言中线程同步的方式

    C语言中线程同步的方式 线程同步 互斥锁 读写锁 条件变量 信号量 线程同步 在多线程环境中,线程之间由于竞争共享资源(临界资源)容易引起数据不一致的问题.一般采用互斥锁(互斥信号量)解决,保证只有一 ...

  8. JAVA中线程同步的方法(7种)汇总

    JAVA中线程同步的方法(7种)汇总 同步的方法: 一.同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法. ...

  9. JAVA中线程同步的几种实现方法

    JAVA中线程同步的几种实现方法 一.synchronized同步的方法: 1.synchronized同步方法 即有synchronized关键字修饰的方法. 由于java的每个对象都有一个内置锁, ...

最新文章

  1. posix_kill 信号
  2. 9.10 css
  3. Gitlab服务器搭建
  4. JavaScript pop()函数弹出数组最后数据
  5. 博主新书:《大数据日知录:架构与算法》目录
  6. if match header test - 428 Precondition required
  7. SwipeRefreshLayout官方推荐下拉刷新
  8. 静态和动态include
  9. python补充urllib教程,Python爬虫之urllib基础用法教程
  10. php自增删除开始,PHP的自增自减操作
  11. 【排序算法】归并排序-递归方法
  12. 关闭SqlConnection的方法
  13. 一些FORK函数的例子
  14. [生存志] 第142节 韩赵陈郑燕辽
  15. 数组方法的增删等19种操作:unshift 、shift,push、pop、splice等等...!
  16. h5文件格式数据集制作
  17. 生成EAN13条码(C语言实现)
  18. 破解从 AppStore 下载的 IPA
  19. 唐尼vr眼镜好吗_VR怎么看电影?手把手教你用VR眼镜设备看电影的方法
  20. 浅谈Git原理和常用命令(学习笔记)

热门文章

  1. 明略科技完成2亿美元E+轮融资,中俄投资基金领投,腾讯、弘卓资本等跟投
  2. 谷歌AI错杀Chrome插件,全职奶爸程序员“睡后收入”被迫终结
  3. 帮初学者快速上手机器学习,这有一份Colab资源大全
  4. 英伟达推出Super显卡,老黄再现精准“刀法”,网友:都是被AMD逼的
  5. 【BZOJ】3456: 城市规划 动态规划+多项式求逆
  6. js深度解析url地址
  7. lesson4-Qt窗口
  8. 第6章 数组----复制数组
  9. 《Go语言编程》学习笔记 (二)
  10. 人生,是一种无法抗拒的前进