今天遇到了一个初学关键段的问题,在多线程运行条件下,关键段总是遇到异常,先说一说代码
#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是一种面向...
- **建议**:根据自己的职业规划和个人兴趣选择一两个方向进行深耕,这样更容易在竞争激烈的市场中脱颖而出。 #### 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'不能转换为有效的数字,...