1. 利用Mutex 互斥对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hMutex; //互斥对象 int main() { HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); hMutex = CreateMutex(NULL,FALSE,NULL); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); //有信号时才返回 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hMutex,INFINITE); if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; ReleaseMutex(hMutex);//释放互斥对象 } return 0; }

2. 利用Event 事件对象

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; HANDLE hEvent; //事件 int main() { hEvent = CreateEvent(NULL,FALSE,FALSE,NULL); //创建事件 SetEvent(hEvent);//设置成有信号状态 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ WaitForSingleObject(hEvent,INFINITE); //事件有信号才返回 ResetEvent(hEvent); //设成无信号,以免其余线程访问 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; SetEvent(hEvent);//设为有信号,以供其余线程调用 } return 0; }

3. 利用临界区 CRITICAL_SECTION 效率更高

#include <iostream.h> #include <windows.h> DWORD WINAPI Fun1Proc( LPVOID lpParameter ); DWORD WINAPI Fun2Proc( LPVOID lpParameter ); int tickets = 100; CRITICAL_SECTION cs;//临界区 int main() { InitializeCriticalSection(&cs); //初始化临界区 HANDLE hThread1,hThread2; hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL); hThread2 = CreateThread(NULL,0,Fun2Proc,NULL,0,NULL); CloseHandle(hThread1); CloseHandle(hThread2); Sleep(8000); return 1; } DWORD WINAPI Fun1Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread1 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; } DWORD WINAPI Fun2Proc( LPVOID lpParameter ) { while (TRUE){ EnterCriticalSection(&cs); //进入临界区 if(0 == tickets) break; cout<<"Thread2 sell tickets "<<tickets--<<endl; LeaveCriticalSection(&cs); //离开临界区 } return 0; }

转载于:https://www.cnblogs.com/JarvisChu/archive/2010/08/06/2752545.html

C++ 线程同步 (学习笔记)相关推荐

  1. MIT的学习资料(reading部分)锁与同步学习笔记

    MIT的学习资料(reading部分)锁与同步学习笔记 系统构件题材及问题探讨 锁和同步 目标 了解一个锁是用于保护共有的可变数据 能够认识到的僵局以及知道战略,以防止它 知道监视器模式,并能够将其应 ...

  2. Java线程同步学习,线程不安全案例讲解,同步方法和同步块 synchronized

    本文主要是自己学习多线程时,所做的笔记,参考的是b站狂神说Java多线程视频讲解. 目录如下: 文章目录 线程同步 一.三大线程不安全案例 1.买票案例 2.不安全取钱 3.线程不安全 二.同步方法及 ...

  3. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  4. golang 线程 Java线程_Golang 学习笔记(06)—— 多线程

    Golang 介绍 线程是cpu调度的最小单位,只有不同的线程才能同时在多核cpu上同时运行.但线程太占资源,线程调度开销大.go中的goroutine是一个轻量级的线程,执行时只需要4-5k的内存, ...

  5. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  6. Linux线程互斥学习笔记--详细分析

    一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...

  7. ETHREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  8. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  9. THREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  10. 学习笔记:Java 并发编程②_管程

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

最新文章

  1. java web基础1Tomcat服务器基本知识
  2. Android: 自定义Tab样式
  3. 使用Java的BlockingQueue实现生产者-消费者
  4. 什么是Vue?为什么要学习Vue?如何使用Vue?
  5. 2021高考个人成绩排名查询,2021新高考八省联考实力排名:怎么查联考成绩在全省排名?...
  6. vue中页面跳转,显示在顶部
  7. [OpenJudge 3066]随机序列
  8. 一道头条算法题,一种不为人知的解法!
  9. 记OC迁移至swift中笔记20tips
  10. 华为路由交换常见配置
  11. 2.1 CMMI2级——7个PA简述
  12. ERP系统之比较——SAP Oracle BAAN JDE SSA
  13. EJB到底是什么?(通俗易懂白话文)
  14. 微信小程序UI设计规范及文档模版
  15. FLASH编程与改变程序(代码)存储地址的问题
  16. 一个劣质无线鼠标接收器导致笔记本无线网络连接出现故障
  17. 个人表现怎么写学生_个人主要事迹怎么写
  18. Java中XML运用总结
  19. 【LeetCode】每日一题——保持城市天际线
  20. 记一次python考试题

热门文章

  1. 触发器_PLCDCS组态中SR触发器介绍
  2. 【java】java Parallel GC 该怎么看?
  3. 【clickhouse】clickhouse 表引擎 之 VersionedCollapsingMergeTree
  4. 【JSON】FastJson 打印输格式化输出
  5. 【Spark】Spark调优 资源调优
  6. Flink : Flink run yarn 报错 could not build the program from jar file -ynm
  7. Maven: Could not transfer artifact xxx from/to xxx
  8. 如何正确的停掉线程?这里面大有门道!
  9. Redis高频面试笔记:基础+缓存雪崩+哨兵+集群+Reids场景设计
  10. 从入门到入土(十)RocketMQ集群流程以及核心概念