gpt4 book ai didi

c++ - 如何在 C++ 中使用 winapi 事件解决生产者-消费者问题?

转载 作者:行者123 更新时间:2023-11-30 05:15:13 26 4
gpt4 key购买 nike

我需要使用原始同步对象 - 事件来解决 C++ 中的生产者-消费者问题,我已经编写了这段代码

static int g_x = 0;
HANDLE hEvent1;

HANDLE aThread[2];
DWORD ThreadID;

//tread 1
void Producer()
{
for (int i = 0; i < 100; ++i)
{
WaitForSingleObject(hEvent1, INFINITE);
g_x = i;
SetEvent(hEvent1);
}
}
//thread 2
void Consumer()
{
for (;;)
{
WaitForSingleObject(hEvent1, INFINITE);
SetEvent(hEvent1);
}
}

int createthreads() {
hEvent1 = CreateEvent(NULL, FALSE, TRUE, NULL);

// Create worker threads
aThread[0] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, &ThreadID);
aThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, &ThreadID);
}
int main() {
createthreads();
}

此代码无法正常工作:我有无限循环我如何修复此代码以获取从 099 的控制台编号?

最佳答案

您需要另一个事件来同步这两个线程。此外,我将两个事件的初始状态设置为 FALSE,并向 main 上的生产者线程发送一个启动事件。
这样您就可以控制流程的启动时间和方式。

和 Offtopic 一样,createthreads 必须返回一个值。

static int g_x = 0;
HANDLE hEvent1;
HANDLE hEvent2;

HANDLE aThread[2];
DWORD ThreadID;

//tread 1
void Producer()
{
for (int i = 0; i < 100; ++i)
{
WaitForSingleObject(hEvent1, INFINITE);
g_x = i;
SetEvent(hEvent2);
}
}
//thread 2
void Consumer()
{
for (;;)
{
WaitForSingleObject(hEvent2, INFINITE);
SetEvent(hEvent1);
}
}

int createthreads() {
hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);

// Create worker threads
aThread[0] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, &ThreadID);
aThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, &ThreadID);
return 0;
}
int main() {
createthreads();
SetEvent(hEvent1);
}

关于c++ - 如何在 C++ 中使用 winapi 事件解决生产者-消费者问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43193506/

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