⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.cpp

📁 验证进程同步的信号量方法的C程序
💻 CPP
字号:
#include <stdio.h> 
#include <windows.h> 
#include <iostream.h>
#include <winbase.h> 
#define THREAD_INSTANCE_NUMBER	3

//全局变量
int iCounter=0;

DWORD SubThreadA(void * pD)
{
	int iID=(int)pD;
	
	//在内部重新打开
	HANDLE hCounterIn=OpenEvent(EVENT_ALL_ACCESS,FALSE,"sam sp 44");

	cout << "Thread " << iID << " begin." << endl;

	//设置成为有信号状态
	Sleep(1000);
	cout << "Thread " << iID << " set event." << endl;
	SetEvent(hCounterIn);
	Sleep(1000);
	cout << "Thread " << iID << " end." << endl;
	CloseHandle(hCounterIn);
	return 0;
}

DWORD SubThreadB(void* pD)
{//等待threadA结束后在继续执行
	int iID=(int)pD;
	//在内部重新打开
	HANDLE hCounterIn=OpenEvent(EVENT_ALL_ACCESS,FALSE,"sam sp 44");

	if(WAIT_TIMEOUT == WaitForSingleObject(hCounterIn,10*1000))
	{
		cout << "Thread " << iID << " wait time out." << endl;
	}
	else
	{
		cout << "Thread " << iID << " wait ok." << endl;
	}
	CloseHandle(hCounterIn);
	return 0;
}


void main(void)
{
	HANDLE hCounter=NULL;
	if( (hCounter=OpenEvent(EVENT_ALL_ACCESS,FALSE,"sam sp 44"))==NULL)
	{
		//如果没有其他进程创建这个事件,则重新创建,该事件为人工重置事件
		hCounter = CreateEvent(NULL,TRUE/*人工重置*/,FALSE,"sam sp 44");
	}

	DWORD IDThread[THREAD_INSTANCE_NUMBER]; 
   	HANDLE hThread[THREAD_INSTANCE_NUMBER];
	int i;

    cout << "Test of manual rest event." << endl;

	//创建线程
    cout << "CreateThread" << endl;
	for (i=0;i<THREAD_INSTANCE_NUMBER;i++)
	{
		if (i==0)
		{	// Create one SubThreadA
			hThread[i] = CreateThread(NULL, // no security attributes 
	    	     0,                           // use default stack size 
	        	 (LPTHREAD_START_ROUTINE) SubThreadA, // thread function 
	        	 (void *)i,                    // no thread function argument 
	        	 0,                       // use default creation flags 
	        	 &(IDThread[i]));              // returns thread identifier 
		
			// Check the return value for success. 
			if (hThread[i] == NULL)
				cout << "CreateThread error" << i << endl;
				else
				cout << "CreateThread: " << i << endl;
		}
		else
		{	// Create two SubThreadB
			hThread[i] = CreateThread(NULL, // no security attributes 
	    	     0,                           // use default stack size 
	        	 (LPTHREAD_START_ROUTINE) SubThreadB, // thread function 
	        	 (void *)i,                    // no thread function argument 
	        	 0,                       // use default creation flags 
	        	 &(IDThread[i]));              // returns thread identifier 
		
			// Check the return value for success. 
			if (hThread[i] == NULL)
				cout << "CreateThread error" << i << endl;
				else
				cout << "CreateThread: " << i << endl;
		}
		
	}
	//等待线程结束
	WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);

	//关闭句柄
	CloseHandle(hCounter);

    cout << "Test of auto rest event." << endl;

	if( (hCounter=OpenEvent(EVENT_ALL_ACCESS,FALSE,"sam sp 44"))==NULL)
	{
		//如果没有其他进程创建这个事件,则重新创建,该事件为自动重置事件
		hCounter = CreateEvent(NULL,FALSE/*自动重置*/,FALSE,"sam sp 44");
	}

	//创建线程
    cout << "CreateThread" << endl;
	for (i=0;i<THREAD_INSTANCE_NUMBER;i++)
	{
		if (i==0)
		{	// Create one SubThreadA
			hThread[i] = CreateThread(NULL, // no security attributes 
	    	     0,                           // use default stack size 
	        	 (LPTHREAD_START_ROUTINE) SubThreadA, // thread function 
	        	 (void *)i,                    // no thread function argument 
	        	 0,                       // use default creation flags 
	        	 &(IDThread[i]));              // returns thread identifier 
		
			// Check the return value for success. 
			if (hThread[i] == NULL)
				cout << "CreateThread error" << i << endl;
				else
				cout << "CreateThread: " << i << endl;
		}
		else
		{	// Create two SubThreadB
			hThread[i] = CreateThread(NULL, // no security attributes 
	    	     0,                           // use default stack size 
	        	 (LPTHREAD_START_ROUTINE) SubThreadB, // thread function 
	        	 (void *)i,                    // no thread function argument 
	        	 0,                       // use default creation flags 
	        	 &(IDThread[i]));              // returns thread identifier 
		
			// Check the return value for success. 
			if (hThread[i] == NULL)
				cout << "CreateThread error" << i << endl;
				else
				cout << "CreateThread: " << i << endl;
		}
		
	}

	//等待线程结束
	WaitForMultipleObjects(THREAD_INSTANCE_NUMBER,hThread,TRUE,INFINITE);
	//关闭句柄
	CloseHandle(hCounter);

	cout << "over" << endl;
//	Sleep(5000);
return ;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -