WaitForMultipleObjects函数存在一个固定的有效值为1~64,所以在上一篇(http://xiabin1235910-qq-com.iteye.com/admin/blogs/1968778)文章中,当线程数大于64时,会出现不稳定现象,如下:(此时线程数为70)
如果在输出的语句之前,加上一个sleep(500)语句,则会正常,代码如下:
#include <windows.h> #include <process.h> #include <iostream> using namespace std; const int THREADNUM = 70; volatile long number = 0; unsigned int __stdcall threadFunc(PVOID pM) { Sleep(100); InterlockedIncrement(&number); Sleep(50); return 0; } int main() { int num = 20; HANDLE handle[THREADNUM]; while(num--) { number = 0; for(int i=0; i< THREADNUM; i++) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, threadFunc, NULL, 0, NULL); } WaitForMultipleObjects(THREADNUM, handle, TRUE ,INFINITE); Sleep(500); cout << "计数个数为" << number << endl; } getchar(); return 0; }
输出结果为:
所以,保险起见,在使用WaitForMultipleObjects函数时,还是要把线程数控制在64以下。
若线程数大于64,则需要考虑用别的方法。
相关推荐
`WaitForMultipleObjects()`函数是Windows操作系统提供的一种高级同步机制,它允许一个线程等待多个对象的状态变化,从而有效地管理和协调多个线程之间的协作。在这个"多线程比赛WaitForMultipleObjects()函数的应用...
CreateThread函数用于创建新的执行线程,而WaitForSingleObject或WaitForMultipleObjects函数则用于同步线程,确保它们按照预期顺序执行。进程是资源分配的基本单位,而线程则是执行的基本单位。 5. **内存管理**:...
在Windows API中,我们可以使用CreateSemaphore函数创建一个信号量对象,并通过WaitForSingleObject或WaitForMultipleObjects函数来等待信号量。 接下来,我们探讨线程同步的基本概念。在多线程环境中,线程同步是...
任务通过WaitForSingleObject或WaitForMultipleObjects函数等待信号量,当信号量的值大于0时,任务会被唤醒并减小信号量的值;如果值为0,则任务被挂起,直到其他任务释放信号量。ReleaseSemaphore函数则用于增加...
在Windows操作系统中,多线程编程是一项核心的编程技术,它允许程序同时执行多个不同的任务,从而提升程序的效率和响应性。本教程将深入探讨Windows多线程...在实际工作中,源码分析和案例研究是提升技能的有效途径。
在VC++中,我们可以使用Windows API中的`CreateSemaphore`函数创建一个信号量,并通过`WaitForSingleObject`或`WaitForMultipleObjects`来等待信号量,当资源可用时,`ReleaseSemaphore`函数用于释放信号量,让其他...
- **等待多个对象**:`WaitForMultipleObjects`函数可以等待多个事件对象中的任意一个变为已触发状态。`bWaitAll`参数用于指定是等待所有对象还是任一对象。如果至少有一个对象在指定时间内变为已触发状态,则返回...
### 知识点生成 #### 标题与描述解析 标题:“判断一个32位程序是否结束...” ...通过结合Windows API函数和VB语言特性,能够有效地监测进程状态,这对于实现自动化任务和提高程序效率具有重要意义。
`WaitForSingleObject`和`WaitForMultipleObjects`函数用于等待线程的结束,而`CloseHandle`则用来关闭线程句柄。 **线程优先级** Windows系统允许设置线程的优先级,以影响调度。`SetThreadPriority`函数可以调整...
- `WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程等待指定对象的状态变化,如信号量、事件、互斥体等。 - `PostThreadMessage`发送消息到目标线程的消息队列,实现线程间的非阻塞通信。 - `...
线程在等待资源访问时,会调用`WaitForSingleObject`或`WaitForMultipleObjects`函数。当互斥对象可用时,这些等待函数会返回,但与普通内核对象不同,它们返回的值会指示线程是否因前一个拥有者线程终止而造成资源...
线程通过调用`WaitForSingleObject()`或`WaitForMultipleObjects()`函数来尝试获取信号量,如果计数不为零,计数会减一,线程继续执行;若计数为零,线程会被挂起,直到其他线程释放信号量(增加计数)后才能继续...
3. **线程等待**:`WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程间同步,等待特定线程结束或其他事件发生。 四、线程安全 1. **临界区**:临界区是保护共享资源的简单机制,一次只允许一个线程...
总之,`_beginthreadex`是C++中创建多线程的有效方式,结合适当的同步机制和等待函数,可以实现线程间的高效协作,完成复杂的并发任务。在实际编程中,还需注意线程安全、资源管理等问题,确保程序的稳定性和正确性...
1. 在类的初始化阶段,通过`CSemaphore`构造函数设置信号量的初始值和最大值。 2. 在需要访问共享资源的线程中,使用`WaitForSingleObject`或`WaitForMultipleObjects`函数尝试获取信号量。如果成功,线程可以继续...
对于信号量,我们可以使用CreateSemaphore函数创建,WaitForSingleObject或WaitForMultipleObjects函数等待信号量,ReleaseSemaphore函数释放信号量。 以下是一个简单的示例代码框架: ```cpp #include #include ...
`CreateMutex`函数在Windows环境下提供了这样的功能,使得开发者能够有效地管理进程间的资源访问。通过学习和理解这些概念,并结合实际的`MutexTest`代码,我们可以更好地掌握并发编程中的同步策略,提高软件的稳定...
Windows中的一些通用等待函数如WaitForSingleObject、WaitForMultipleObjects等可以用来等待任意类型的同步对象。 与Windows不同,Linux中使用的同步原语包括信号量、条件变量和互斥锁。在Linux中,每个原语都有其...
3. **WaitForSingleObject()** 和 **WaitForMultipleObjects()**: 这两个函数用于等待线程或事件对象。它们可以用来同步线程,确保线程按预期顺序执行或等待特定线程完成。 4. **CloseHandle()**: 释放由...
线程通过调用`WaitForSingleObject`或`WaitForMultipleObjects`等待信号量,当信号量的计数值大于0时,调用`ReleaseSemaphore`增加计数值,从而允许其他线程继续执行。 以下是一个简单的MFC工程中使用信号量的步骤...