`

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

 
阅读更多

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

#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是一种面向...

    给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'不能转换为有效的数字,...

Global site tag (gtag.js) - Google Analytics