`

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

 
阅读更多

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

#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的21个问题 #### 一、引言 在数据库管理与应用开发领域,SQL Server 是一款广泛使用的数据库管理系统。然而,在日常使用中,即便是经验丰富的开发者也可能忽略某些重要的实践原则,...

    DELPHI包初学者小心的几点

    3. **事件驱动编程**:Delphi采用事件驱动模型,初学者可能对事件处理不熟悉,容易写出难以维护的代码。理解事件触发的机制,合理组织事件处理函数,有助于编写清晰的程序逻辑。 4. **错误处理**:在编程过程中,...

    java初学者福音

    4. 编写Java程序最容易犯的21种错误: 初学者常犯的错误包括: - 忘记分号或括号不匹配 - 不理解作用域规则,导致变量未声明或不可见 - 对null值处理不当,引发NullPointerException - 不合理使用equals()和==,混淆...

    FPGA牛人给初学者入门留下的几点心得体会

    这门课程强调了实际设计和应用的重要性,同时帮助初学者指出了很多自学中容易忽略的问题。明德扬课程的核心在于点透学习误区,拨出设计精髓。通过这样的课程,作者很快意识到,之前的学习方法确实存在误区,即过分...

    学习java的积点忽略之处

    在学习Java的过程中,许多初学者可能会忽略一些关键的细节,这些细节往往会在后续的编程实践中带来困扰。以下是我从我的读书笔记中整理出的一些容易被忽视的Java学习知识点。 1. **基本概念理解**:Java是一种面向...

    给初学编程者的忠告.doc

    2. 咬文嚼字的孔已己作风:过度关注细节和理论的背诵,如记下网络协议的具体参数,却忽略了背后的原理。学习“为什么”比学习“怎么做”更重要,尤其是对于《原理》类课程,应理解其核心思想而非机械记忆。 3. 盲目...

    给C++初学者的忠告

    - **建议**:根据自己的职业规划和个人兴趣选择一两个方向进行深耕,这样更容易在竞争激烈的市场中脱颖而出。 #### 15. 避免陷入“C++与C的关系”误区 - **解释**:虽然C++最初是从C发展而来的,但它已经发展成为...

    BIOS设置图解一个初学者的教程

    图解教程会提供清晰的步骤和图像说明,帮助初学者更容易地理解和操作。在使用"BIOS设置图解.exe"这个程序时,按照提示逐步进行,仔细阅读每个设置的描述,确保你明白更改的含义和影响。 总的来说,熟悉BIOS设置对于...

    Java学习时容易陷入的误区

    Java学习时,初学者往往容易陷入一些误区,这些误区可能会阻碍他们的学习进程和技能提升。以下是一些常见的问题和相应的解决建议: 1. **盲目追求高级特性**:有些学习者在接触Java时,过于热衷于尝试最新的特性和...

    刚开始用PSPICE仿真的时候容易遇到的问题

    在初学者尝试使用PSPICE进行电路仿真时,往往会遇到一系列常见问题,这些问题不仅涉及到软件操作层面,还可能涉及对电路原理理解的深度。本文将深入解析这些难点,帮助新手更好地掌握PSPICE的使用技巧。 ### 1. ...

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

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

    计算机科学与编程中的抽象学-计算机编程(1).pdf )

    抽象是计算机科学与编程的核心概念之一,它涉及到从复杂系统中提取关键特征,忽略不相关的细节,从而简化问题的处理。通过建立更高层次的抽象,可以有效地管理复杂度,使程序员能够专注于问题的解决方案而非细节。...

    绝对经典 C++初学者必看的50个建议

    - **建议**:每隔一段时间就复习一次之前学过的内容,并尝试将新学到的知识应用到实践中。 #### 15. 关注社区动态 - **重要性**:紧跟最新技术趋势有助于保持竞争力。 - **建议**:加入相关的论坛或社区(如 Stack...

    浅谈C语言学习.pdf

    然而,对于初学者而言,学习C语言并不容易,常常会遇到一系列的挑战和问题。 首先,学习C语言时,初学者面临的第一个问题通常是因为缺乏坚实的基础知识,导致难以适应C语言的学习节奏和要求。刚从高中过渡到大学的...

    学电路设计过程中的那些趣事,被当时的自己蠢哭了....zip

    2. **模拟电路设计**:模拟电路涉及运算放大器、滤波器等,初学者容易在搭建电路时忽略负反馈的重要性,导致电路性能不稳定。另外,计算放大器增益、频率响应等参数时,不注意失调电压、增益带宽积等限制条件,也会...

    PHP容易被忽略而出错陷阱 数字与字符串比较

    这个特性是许多初学者以及经验丰富的开发者容易忽略的。例如,以下代码: ```php if('abc' == 0) { echo 'equal'; // 会输出equal,因为'abc'被转换成了0 } ``` 上述代码中,字符串'abc'不能转换为有效的数字,...

    初级会计实务易错易混点.pdf

    初级会计实务通常涉及到会计学的基础知识和实际操作技能,对于初学者来说,理解基础概念、会计原则、账户分类、记账方法以及财务报表编制等方面是关键。然而,在学习过程中,有一些知识点是经常被混淆或者错误理解的...

    算法(第四版)第一章1.1课后答案

    抽象则是忽略问题的细节,专注于关键特征,帮助简化问题并构建解决方案。 9. **案例研究**:课后习题可能包括一些经典的算法问题,如“两数之和”、“找出数组中的最大值”等,这些问题可以帮助读者实际应用所学的...

Global site tag (gtag.js) - Google Analytics