初学关键段容易忽略的问题
今天遇到了一个初学关键段的问题,在多线程运行条件下,关键段总是遇到异常,先说一说代码
#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);
运行正常:
注: 因为子线程之间没有采用同步处理,故输出的值是乱的。
初学关键段容易忽略的问题相关推荐
- 秒杀多线程第五篇 经典线程同步 关键段CS
上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...
- [一个经典的多线程同步问题]解决方案一:关键段CS
前面提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文先介绍如何使用关键段,然后再深层次的分析下关键段的实现机制和原理. 关键段CRITICA ...
- 经典线程同步 关键段CS
本文参考http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION一共就四个函数,使用很是方便.下面是这四 ...
- Windows多线程(三) 关键段 CS
本博文参考:http://blog.csdn.net/morewindows/article/details/7442639 关键段CRITICAL_SECTION 四个函数 函数功能:初始化 函数原 ...
- 秒杀多线程第十五篇 关键段,事件,互斥量,信号量的“遗弃”问题
秒杀多线程第十五篇 关键段,事件,互斥量,信号量的"遗弃"问题 在<秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量>中对经典多线程同步互斥问题进行了回 ...
- 秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量
前面<秒杀多线程第四篇一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了 ...
- 关键段 互斥量 以及信号量
关键段(主要是用户模式下的线程同步,但是竞争激烈的情况下会进入内核态) 一般是EnterCriticalSection和LeaveCriticalScetion配对使用,需要先创建一个CRITICAL ...
- Windows线程同步--关键段和旋转锁
关键段 关键段(Critical Section)是一小段代码,它在执行之前需要独占对一些共享资源的访问权.这种方式可以让多行代码以"原子方式"对资源进行操控.这里的原子方式,指的 ...
- 经典线程同步总结 关键段 事件 互斥量 信号量
本文参考了http://blog.csdn.net/morewindows/article/details/7538247 1.线程(进程)同步的主要任务 答:在引入多线程后,由于线程执行的异步性,会 ...
最新文章
- 【IOS】获取顶层UIViewController
- Laravel+nginx环境配置好后,url加参数提交报404错误
- mysql查看优化后的语句_Mysql查看优化后的SQL 语句
- nssl1335-蛋糕切割【数论,GCD】
- 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
- C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
- 70. Climbing Stairs 题解
- 京东回应拖欠神州 3 亿多元货款;苹果考虑将第三方浏览器和邮件设为默认;PS 诞生 30 周年| 极客头条...
- 【SpringBoot_ANNOTATIONS】组件注册 01 @Configuration @Bean
- 行人重识别论文阅读4,行人重识别实验笔记1-无锚行人搜索框架
- mysql webmail ubuntu12.04 imap_如何在Ubuntu 18.04 LTS上安装最新的Roundcube Webmail
- Editor: 维护一个整数编辑器 HDOJ4699
- c语言中进入临界区函数,VC/MFC 临界区使用方法事例
- php小型购物网站,PHP实现一个多功能购物网站
- 图解 魔方快速还原 7步法
- TabWidget当前标签底线颜色
- Mac设置重置Python3环境
- 如何使用KMS激活win10和office
- 离谱的 CSS!从表盘刻度到剪纸艺术
- 计算任意多边形的面积