【发布时间】:2012-10-30 20:39:44
【问题描述】:
#include <windows.h>
#include <iostream>
using namespace std;
int count = 0;
DWORD WINAPI Tf1 ( LPVOID n )
{
HANDLE hEvent = OpenEvent ( EVENT_ALL_ACCESS , false, (LPCWSTR)"MyEvent" );
if ( !hEvent ) { return -1; }
// Loop through and wait for an event to occur
for ( ;; )
{
// Wait for the Event
WaitForSingleObject ( hEvent, INFINITE );
count++;
printf("In function1, Counter value: %d\n",count);
// No need to Reset the event as its become non signaled as soon as
// some thread catches the event.
if( count > 7 ) return 0;
}
CloseHandle(hEvent);
return 0;
}
DWORD WINAPI Tf2 ( LPVOID n )
{
HANDLE hEvent = OpenEvent ( EVENT_MODIFY_STATE , false, (LPCWSTR)"MyEvent" );
if ( !hEvent ) return -1;
for ( ;; )
{
if( count % 2 == 0)
SetEvent (hEvent);
else
{
count++;
printf("In function2, Counter value: %d\n",count);
}
// No need to Reset the event as its become non signaled as soon as
// some thread catches the event.
if( count > 7 ) return 0;
}
CloseHandle(hEvent);
return 0;
}
int main()
{
// Create an Auto Reset Event which automatically reset to
// Non Signalled state after being signalled
HANDLE hEvent = CreateEvent ( NULL , false , false , (LPCWSTR)"MyEvent" );
if ( !hEvent ) return -1;
// Create a Thread Which will wait for the events to occur
HANDLE mutex = CreateMutex(NULL, FALSE, NULL);
DWORD Id;
HANDLE hThrd1 = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)Tf1,0,0,&Id );
HANDLE hThrd2 = CreateThread ( NULL, 0, (LPTHREAD_START_ROUTINE)Tf2,0,0,&Id );
if ( !hThrd1 ) { CloseHandle (hEvent); return -1; }
if ( !hThrd2 ) { CloseHandle (hEvent); return -1; }
// Wait for a while before continuing....
Sleep ( 1000 );
// Give the signal twice as the thread is waiting for 2 signals to occur
// Wait for the Thread to Die
WaitForSingleObject ( hThrd1, INFINITE );
WaitForSingleObject ( hThrd2, INFINITE );
CloseHandle ( hThrd1 );
CloseHandle ( hThrd2 );
CloseHandle ( hEvent );
system ( "PAUSE" );
return 0;
}
O/P:
In function1, Counter value: 1
In function1, Counter value: 3
In function2, Counter value: 2
In function2, Counter value: 4
In function2, Counter value: 6
In function1, Counter value: 5
In function1, Counter value: 7
In function2, Counter value: 8
所需的 O/P:
In function1, Counter value: 1
In function2, Counter value: 2
In function1, Counter value: 3
In function2, Counter value: 4
In function1, Counter value: 5
In function2, Counter value: 6
In function1, Counter value: 7
In function2, Counter value: 8
我知道我没有利用线程的力量。但我的要求是这样的。我怎样才能做到这一点?
【问题讨论】:
-
那为什么要使用线程呢?这个要求从何而来?
-
线程用于并行行为,如果你想串行执行使用单个线程
-
我想让 2 个线程按顺序执行(不是单线程)。控制从线程 1 到线程 2,然后是线程 1,然后是线程 2...顺便说一句,这是我的教授给我的一个小任务。 .
-
不会再来了!这种“请告诉我如何完全滥用线程”现在比“浮点运算不准确”更频繁地出现。就像@EtiennedeMartel 所说的那样——这些垃圾来自哪个可悲的教科书/教程/页面?哦——教授。告诉你的教授。想出更好的任务!
标签: c++ c multithreading winapi