今天遇到了一个初学关键段的问题,在多线程运行条件下,关键段总是遇到异常,先说一说代码
#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);
运行正常:
注: 因为子线程之间没有采用同步处理,故输出的值是乱的。
相关推荐
### 使用时容易忽略SQL Server的21个问题 #### 一、引言 在数据库管理与应用开发领域,SQL Server 是一款广泛使用的数据库管理系统。然而,在日常使用中,即便是经验丰富的开发者也可能忽略某些重要的实践原则,...
3. **事件驱动编程**:Delphi采用事件驱动模型,初学者可能对事件处理不熟悉,容易写出难以维护的代码。理解事件触发的机制,合理组织事件处理函数,有助于编写清晰的程序逻辑。 4. **错误处理**:在编程过程中,...
4. 编写Java程序最容易犯的21种错误: 初学者常犯的错误包括: - 忘记分号或括号不匹配 - 不理解作用域规则,导致变量未声明或不可见 - 对null值处理不当,引发NullPointerException - 不合理使用equals()和==,混淆...
这门课程强调了实际设计和应用的重要性,同时帮助初学者指出了很多自学中容易忽略的问题。明德扬课程的核心在于点透学习误区,拨出设计精髓。通过这样的课程,作者很快意识到,之前的学习方法确实存在误区,即过分...
在学习Java的过程中,许多初学者可能会忽略一些关键的细节,这些细节往往会在后续的编程实践中带来困扰。以下是我从我的读书笔记中整理出的一些容易被忽视的Java学习知识点。 1. **基本概念理解**:Java是一种面向...
2. 咬文嚼字的孔已己作风:过度关注细节和理论的背诵,如记下网络协议的具体参数,却忽略了背后的原理。学习“为什么”比学习“怎么做”更重要,尤其是对于《原理》类课程,应理解其核心思想而非机械记忆。 3. 盲目...
- **建议**:根据自己的职业规划和个人兴趣选择一两个方向进行深耕,这样更容易在竞争激烈的市场中脱颖而出。 #### 15. 避免陷入“C++与C的关系”误区 - **解释**:虽然C++最初是从C发展而来的,但它已经发展成为...
图解教程会提供清晰的步骤和图像说明,帮助初学者更容易地理解和操作。在使用"BIOS设置图解.exe"这个程序时,按照提示逐步进行,仔细阅读每个设置的描述,确保你明白更改的含义和影响。 总的来说,熟悉BIOS设置对于...
Java学习时,初学者往往容易陷入一些误区,这些误区可能会阻碍他们的学习进程和技能提升。以下是一些常见的问题和相应的解决建议: 1. **盲目追求高级特性**:有些学习者在接触Java时,过于热衷于尝试最新的特性和...
在初学者尝试使用PSPICE进行电路仿真时,往往会遇到一系列常见问题,这些问题不仅涉及到软件操作层面,还可能涉及对电路原理理解的深度。本文将深入解析这些难点,帮助新手更好地掌握PSPICE的使用技巧。 ### 1. ...
很多初学者也包括一些有经验的工程师,由于时间紧或者不耐烦亦或者过于自信,往往草草了事,忽略了后期检查。结果出现了一些很基本的BUG,比如线宽不够,元件标号丝印压在过孔上,插座靠得太近,信号出现环路等等。...
抽象是计算机科学与编程的核心概念之一,它涉及到从复杂系统中提取关键特征,忽略不相关的细节,从而简化问题的处理。通过建立更高层次的抽象,可以有效地管理复杂度,使程序员能够专注于问题的解决方案而非细节。...
- **建议**:每隔一段时间就复习一次之前学过的内容,并尝试将新学到的知识应用到实践中。 #### 15. 关注社区动态 - **重要性**:紧跟最新技术趋势有助于保持竞争力。 - **建议**:加入相关的论坛或社区(如 Stack...
然而,对于初学者而言,学习C语言并不容易,常常会遇到一系列的挑战和问题。 首先,学习C语言时,初学者面临的第一个问题通常是因为缺乏坚实的基础知识,导致难以适应C语言的学习节奏和要求。刚从高中过渡到大学的...
2. **模拟电路设计**:模拟电路涉及运算放大器、滤波器等,初学者容易在搭建电路时忽略负反馈的重要性,导致电路性能不稳定。另外,计算放大器增益、频率响应等参数时,不注意失调电压、增益带宽积等限制条件,也会...
这个特性是许多初学者以及经验丰富的开发者容易忽略的。例如,以下代码: ```php if('abc' == 0) { echo 'equal'; // 会输出equal,因为'abc'被转换成了0 } ``` 上述代码中,字符串'abc'不能转换为有效的数字,...
初级会计实务通常涉及到会计学的基础知识和实际操作技能,对于初学者来说,理解基础概念、会计原则、账户分类、记账方法以及财务报表编制等方面是关键。然而,在学习过程中,有一些知识点是经常被混淆或者错误理解的...
抽象则是忽略问题的细节,专注于关键特征,帮助简化问题并构建解决方案。 9. **案例研究**:课后习题可能包括一些经典的算法问题,如“两数之和”、“找出数组中的最大值”等,这些问题可以帮助读者实际应用所学的...