`

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

 
阅读更多

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

#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);

 

运行正常:


 

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

 

 

 

  • 大小: 11.8 KB
  • 大小: 29.4 KB
分享到:
评论

相关推荐

    使用SQL Server时最容易忽略的21个问题

    工具是这篇文章中讲述的最关键的一条。也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。不要使用光标。如果你想破坏整个系统的性能的话,它们倒是你最有效的首选...

    PCB线路板设计后期检查的几个关键点

    很多初学者也包括一些有经验的工程师,由于时间紧或者不耐烦亦或者过于自信,往往草草了事,忽略了后期检查。结果出现了一些很基本的BUG,比如线宽不够,元件标号丝印压在过孔上,插座靠得太近,信号出现环路等等。...

    C++书籍集合

    作者在书中综合性地介绍了C++的发展历史,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景,既没有忽略关键性的详情,又没有过多地陷入技术...

    电脑装机DIY与维护教程

    容易接受和领会另外将电脑组装和维护包括软件部分二者结合起来的书籍也不 在多数所以我们就决定编一本通俗易懂的全面介绍硬件组装和软件维护的书, 本书主要介绍了电脑硬件的选购电脑的组装操作系统的安装系统的...

    PCB检查的细节要素

    很多初学者也包括一些有经验的工程师,由于时间紧或者不耐烦亦或者过于自信,往往草草了事,忽略了后期检查。结果出现了一些很基本的BUG,比如线宽不够,元件标号丝印压在过孔上,插座靠得太近,信号出现环路等等。...

    自己动手写操作系统(含源代码).part2

    但是实际情况往往是,这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间,甚至影响了学习的热情。 我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉。还好我坚持...

    自己动手写操作系统(含源代码).part1

    但是实际情况往往是,这些书中忽略掉的内容恰恰占去了一个初学者大部分的时间,甚至影响了学习的热情。 我至今仍记得当我开始编写自己的操作系统时所遭受的挫败感,那是一种不知道如何着手的无助的感觉。还好我坚持...

    Flash格斗动画的动作设计和动作的制作.doc

    太过基础的问题我不会提起, 完全初学者请买本书进行自学或者[下载本教程],或放弃学习.那么以下我将会每个步骤详细的去说明, 如果你有疑问就是Flash基础操作的问题了, 请自行解决.不过如果你在我的blog进行提问我会...

    二十三种设计模式【PDF版】

    经常以那些技术只适合大型项目为由,避开或忽略它们,实际中,Java 的接口或抽象类是真正体现 Java 思想的核心所在,这些 你都将在 GoF 的设计模式里领略到它们变幻无穷的魔力。 GoF 的设计模式表面上好象也是一种...

    精华游戏算法整理(经典)

    正如我们处理上图网格的方法,一旦搜索区域被转化为容易处理的节点,下一步就是去引导一次找到最短路径的搜索。在A*寻路算法中,我们通过从点A开始,检查相邻方格的方式,向外扩展直到找到目标。 我们做如下操作...

    入门学习Linux常用必会60个命令实例详解doc/txt

    文件为doc版,可自行转成txt,在手机上看挺好的。 本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! ...入门学习Linux常用必会60个命令实例详解 ...Linux提供了大量的命令,利用它...

Global site tag (gtag.js) - Google Analytics