`

WaitForMultipleObjects函数有效值分析

 
阅读更多

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,则需要考虑用别的方法。

 

 

  • 大小: 18.9 KB
  • 大小: 18 KB
分享到:
评论

相关推荐

    多线程比赛WaitForMultipleObjects()函数的应用.rar

    `WaitForMultipleObjects()`函数是Windows操作系统提供的一种高级同步机制,它允许一个线程等待多个对象的状态变化,从而有效地管理和协调多个线程之间的协作。在这个"多线程比赛WaitForMultipleObjects()函数的应用...

    windows编程原理

    CreateThread函数用于创建新的执行线程,而WaitForSingleObject或WaitForMultipleObjects函数则用于同步线程,确保它们按照预期顺序执行。进程是资源分配的基本单位,而线程则是执行的基本单位。 5. **内存管理**:...

    Visual C++信号量线程同步的简单实例工程

    在Windows API中,我们可以使用CreateSemaphore函数创建一个信号量对象,并通过WaitForSingleObject或WaitForMultipleObjects函数来等待信号量。 接下来,我们探讨线程同步的基本概念。在多线程环境中,线程同步是...

    OS-semaphore.rar_Semaphore_semaphore. windows

    任务通过WaitForSingleObject或WaitForMultipleObjects函数等待信号量,当信号量的值大于0时,任务会被唤醒并减小信号量的值;如果值为0,则任务被挂起,直到其他任务释放信号量。ReleaseSemaphore函数则用于增加...

    Windows多线程编程技术与实例

    在Windows操作系统中,多线程编程是一项核心的编程技术,它允许程序同时执行多个不同的任务,从而提升程序的效率和响应性。本教程将深入探讨Windows多线程...在实际工作中,源码分析和案例研究是提升技能的有效途径。

    VC多线程例程十及图解文档(使用信号量进行线程同步)

    在VC++中,我们可以使用Windows API中的`CreateSemaphore`函数创建一个信号量,并通过`WaitForSingleObject`或`WaitForMultipleObjects`来等待信号量,当资源可用时,`ReleaseSemaphore`函数用于释放信号量,让其他...

    C++事件(event)

    - **等待多个对象**:`WaitForMultipleObjects`函数可以等待多个事件对象中的任意一个变为已触发状态。`bWaitAll`参数用于指定是等待所有对象还是任一对象。如果至少有一个对象在指定时间内变为已触发状态,则返回...

    判断一个32位程序是否结束...

    ### 知识点生成 #### 标题与描述解析 标题:“判断一个32位程序是否结束...” ...通过结合Windows API函数和VB语言特性,能够有效地监测进程状态,这对于实现自动化任务和提高程序效率具有重要意义。

    Win32多线程编程源代码.rar

    `WaitForSingleObject`和`WaitForMultipleObjects`函数用于等待线程的结束,而`CloseHandle`则用来关闭线程句柄。 **线程优先级** Windows系统允许设置线程的优先级,以影响调度。`SetThreadPriority`函数可以调整...

    Win32多线程程序设计_WIN32多线程程序设计学习笔记.zip

    - `WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程等待指定对象的状态变化,如信号量、事件、互斥体等。 - `PostThreadMessage`发送消息到目标线程的消息队列,实现线程间的非阻塞通信。 - `...

    Windows程序程序设计---线程同步.pdf

    线程在等待资源访问时,会调用`WaitForSingleObject`或`WaitForMultipleObjects`函数。当互斥对象可用时,这些等待函数会返回,但与普通内核对象不同,它们返回的值会指示线程是否因前一个拥有者线程终止而造成资源...

    使用信号量实现线程同步

    线程通过调用`WaitForSingleObject()`或`WaitForMultipleObjects()`函数来尝试获取信号量,如果计数不为零,计数会减一,线程继续执行;若计数为零,线程会被挂起,直到其他线程释放信号量(增加计数)后才能继续...

    WinThread2.rarWinThread2.rarWinThread2.rarWinThread2.rarWinThread2.rar

    3. **线程等待**:`WaitForSingleObject`和`WaitForMultipleObjects`函数用于线程间同步,等待特定线程结束或其他事件发生。 四、线程安全 1. **临界区**:临界区是保护共享资源的简单机制,一次只允许一个线程...

    采用_beginthreadex创建多线程

    总之,`_beginthreadex`是C++中创建多线程的有效方式,结合适当的同步机制和等待函数,可以实现线程间的高效协作,完成复杂的并发任务。在实际编程中,还需注意线程安全、资源管理等问题,确保程序的稳定性和正确性...

    多线程信号量的测试程序-CSemaphore.rar

    1. 在类的初始化阶段,通过`CSemaphore`构造函数设置信号量的初始值和最大值。 2. 在需要访问共享资源的线程中,使用`WaitForSingleObject`或`WaitForMultipleObjects`函数尝试获取信号量。如果成功,线程可以继续...

    线程经典题目<生产-消费>

    对于信号量,我们可以使用CreateSemaphore函数创建,WaitForSingleObject或WaitForMultipleObjects函数等待信号量,ReleaseSemaphore函数释放信号量。 以下是一个简单的示例代码框架: ```cpp #include #include ...

    一个多进程互斥的例子

    `CreateMutex`函数在Windows环境下提供了这样的功能,使得开发者能够有效地管理进程间的资源访问。通过学习和理解这些概念,并结合实际的`MutexTest`代码,我们可以更好地掌握并发编程中的同步策略,提高软件的稳定...

    windows 与linux 进程间通信区别

    Windows中的一些通用等待函数如WaitForSingleObject、WaitForMultipleObjects等可以用来等待任意类型的同步对象。 与Windows不同,Linux中使用的同步原语包括信号量、条件变量和互斥锁。在Linux中,每个原语都有其...

    操作系统-4.3-Windows线程编程1

    3. **WaitForSingleObject()** 和 **WaitForMultipleObjects()**: 这两个函数用于等待线程或事件对象。它们可以用来同步线程,确保线程按预期顺序执行或等待特定线程完成。 4. **CloseHandle()**: 释放由...

    c++多线程同步——信号量

    线程通过调用`WaitForSingleObject`或`WaitForMultipleObjects`等待信号量,当信号量的计数值大于0时,调用`ReleaseSemaphore`增加计数值,从而允许其他线程继续执行。 以下是一个简单的MFC工程中使用信号量的步骤...

Global site tag (gtag.js) - Google Analytics