gpt4 book ai didi

c++ - 我想让线程的执行顺序依次执行

转载 作者:行者123 更新时间:2023-11-30 21:12:07 25 4
gpt4 key购买 nike

#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

我知道我没有利用线程的力量。但我的要求是这样的。我怎样才能实现这个目标?

最佳答案

这段代码中没有任何东西可以阻止竞争条件。您要么需要两个事件,以便线程与信号和等待打乒乓球,要么用关键部分保护计数器。

选项 1:

// Thread 1
{
increment counter
Signal event 2
Wait on event 1
}

// Thread 2
{
Wait on event 2
increment counter
Signal event 1
}

选项 2:(使用您现有的范例)

// Thread 1
{
Wait on event
Acquire mutex
if count is even
increment counter
end
Release mutex
}

// Thread 2
{
Acquire mutex
if count is even
Signal event
else
increment counter
end
Release mutex
}

请注意,选项二在线程 2 中有点困惑...当线程 1 响应事件时,它可能会旋转多次。在这方面,您也可以完全删除该事件并让两个线程都退出...如果您想避免这种情况,请使用我的选项 1。

还有其他方法可以采用,包括使用互锁增量,但无论如何请尝试上述方法之一。

关于c++ - 我想让线程的执行顺序依次执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13147243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com