今天遇到了一个初学关键段的问题,在多线程运行条件下,关键段总是遇到异常,先说一说代码

#include <iostream>
#include <windows.h>
#include <process.h>using namespace std;const int NUM = 10;
HANDLE semaphore;
CRITICAL_SECTION sc;unsigned int __stdcall funcTh(PVOID pm) {int a = *((int *) pm);EnterCriticalSection(&sc);cout << a << endl;LeaveCriticalSection(&sc);return 0;
}int main() {HANDLE handles[NUM];semaphore = CreateSemaphore(NULL, 0, 1, NULL);InitializeCriticalSection(&sc);int i;for(i=0; i<NUM; i++) {handles[i] = (HANDLE) _beginthreadex(NULL, 0, funcTh, &i, 0, NULL);}DeleteCriticalSection(&sc);CloseHandle(semaphore);getchar();return 0;
}

运行结果很容易让人感觉奇怪,如下:

进入关键段产生不能处理的异常,

认真分析,得出结论: 主线程中的关键段在子线程还没有完全创建完成之前提前关闭。

加入一个多线程的等待线程即可。

for(i=0; i<NUM; i++) {handles[i] = (HANDLE) _beginthreadex(NULL, 0, funcTh, &i, 0, NULL);}WaitForMultipleObjects(NUM, handles, true, INFINITE);

运行正常:

注: 因为子线程之间没有采用同步处理,故输出的值是乱的。

初学关键段容易忽略的问题相关推荐

  1. 秒杀多线程第五篇 经典线程同步 关键段CS

    上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...

  2. [一个经典的多线程同步问题]解决方案一:关键段CS

    前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...

  3. 经典线程同步 关键段CS

    本文参考http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION一共就四个函数,使用很是方便.下面是这四 ...

  4. Windows多线程(三) 关键段 CS

    本博文参考:http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION 四个函数 函数功能:初始化 函数原 ...

  5. 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题

    秒杀多线程第十五篇 关键段,事件,互斥量,信号量的"遗弃"问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回 ...

  6. 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量

    前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...

  7. 关键段 互斥量 以及信号量

    关键段(主要是用户模式下的线程同步,但是竞争激烈的情况下会进入内核态) 一般是EnterCriticalSection和LeaveCriticalScetion配对使用,需要先创建一个CRITICAL ...

  8. Windows线程同步--关键段和旋转锁

    关键段 关键段(Critical Section)是一小段代码,它在执行之前需要独占对一些共享资源的访问权.这种方式可以让多行代码以"原子方式"对资源进行操控.这里的原子方式,指的 ...

  9. 经典线程同步总结 关键段 事件 互斥量 信号量

    本文参考了http://blog.csdn.net/morewindows/article/details/7538247 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步性,会 ...

最新文章

  1. 【IOS】获取顶层UIViewController
  2. Laravel+nginx环境配置好后,url加参数提交报404错误
  3. mysql查看优化后的语句_Mysql查看优化后的SQL 语句
  4. nssl1335-蛋糕切割【数论,GCD】
  5. 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
  6. C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
  7. 70. Climbing Stairs 题解
  8. 京东回应拖欠神州 3 亿多元货款;苹果考虑将第三方浏览器和邮件设为默认;PS 诞生 30 周年| 极客头条...
  9. 【SpringBoot_ANNOTATIONS】组件注册 01 @Configuration @Bean
  10. 行人重识别论文阅读4,行人重识别实验笔记1-无锚行人搜索框架
  11. mysql webmail ubuntu12.04 imap_如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail
  12. Editor: 维护一个整数编辑器 HDOJ4699
  13. c语言中进入临界区函数,VC/MFC 临界区使用方法事例
  14. php小型购物网站,PHP实现一个多功能购物网站
  15. 图解 魔方快速还原 7步法
  16. TabWidget当前标签底线颜色
  17. Mac设置重置Python3环境
  18. 如何使用KMS激活win10和office
  19. 离谱的 CSS!从表盘刻度到剪纸艺术
  20. 计算任意多边形的面积

热门文章

  1. @Scheduled不执行的原因
  2. lua中table的常用方法
  3. Android Studio开发-高效插件强烈推荐
  4. shutdown immediate ,无法关闭数据库的解决方案
  5. uva 11396Claw Decomposotion(二分图判定)
  6. bug经验-文件路径问题
  7. [傅里叶变换及其应用学习笔记] 三十. 拉东变换
  8. 解决 RaspberryPi 树莓派 NTP服务异常 无法自动同步时间
  9. ubuntu中安装apache ab命令进行简单压力测试
  10. Uva 11218 - KTV