gpt4 book ai didi

c++ - 读者作家 - 作家线程总是卡在多个读者线程中

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:00 24 4
gpt4 key购买 nike

新来的。我一直在研究读者/作者问题的解决方案。它适用于 1 位读者和 1 位作者。但是当我将 reader 修改为 2 时;作家线程总是饿死。帮帮我!

似乎 Writer 线程卡在某处等待 wrt mutex。

#include <stdio.h>
#include <conio.h>
#include <windows.h>

HANDLE mutex, wrt;
int g_ReadCount = 0;
int g_GlobalData=0;

const int max = 2;
HANDLE reader[max], writer[max];
CRITICAL_SECTION rSect, wSect;
bool bTerminate = true;

DWORD Readers(LPVOID lpdwThreadParam )
{
while(bTerminate)
{
WaitForSingleObject(mutex, INFINITE);
g_ReadCount++;
if(g_ReadCount == 1)
{
WaitForSingleObject(wrt, INFINITE);
}
ReleaseMutex(mutex);

EnterCriticalSection(&wSect);
printf("ThreadId : %d --> Read data : %d ReaderCount %d\n", GetCurrentThreadId(), g_GlobalData, g_ReadCount);
LeaveCriticalSection(&wSect);

WaitForSingleObject(mutex, INFINITE);
g_ReadCount--;
if(g_ReadCount == 0)
{
ReleaseMutex(wrt);
printf("ThreadId : %d Realesed Mutex wrt\n", GetCurrentThreadId());
}
printf("ThreadId : %d ReaderCount %d\n", GetCurrentThreadId(), g_ReadCount);
ReleaseMutex(mutex);
printf("Reader ThreadId : %d Realesed Mutex mutex\n", g_ReadCount);
Sleep(0);
}
return 0;
}


DWORD Writers(LPVOID lpdwThreadParam )
{
int n = GetCurrentThreadId();
int temp = 1;
while(bTerminate)
{
printf("ThreadId : %d Waiting for WRT\n", GetCurrentThreadId());
WaitForSingleObject(wrt, INFINITE);
printf("WRITER ThreadId : %d ***Got WRT\n", GetCurrentThreadId());
++n;
temp++;

if(temp == 100)
{
//bTerminate = false;
}

EnterCriticalSection(&wSect);
printf("Write by ThreadId : %d Data : %d Temp %d\n", GetCurrentThreadId(), n, temp);
g_GlobalData = n;
LeaveCriticalSection(&wSect);
ReleaseMutex(wrt);
}

printf("***VVV***Exiting Writer Thread\n");
return 0;
}

void main()
{
mutex = CreateMutex(NULL, false, "Writer");
wrt = CreateMutex(NULL, false, "wrt");

InitializeCriticalSection(&rSect);
InitializeCriticalSection(&wSect);
DWORD dwThreadId = 0;



for(int i=0; i < max; i++)
{
reader[i] = CreateThread(NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&Readers,
//Routine to execute
(LPVOID) 0, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
);
}

for(int i=0; i < 1; i++)
{
writer[i] = CreateThread(NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&Writers,
//Routine to execute
(LPVOID) 0, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
);
}


getchar();


}

最佳答案

如果读取器线程超过 1 个,g_ReadCount 很可能永远不会变为零,因此永远不会释放 wrt 互斥量(从而使写入器挨饿) .您可能需要某种指示器来指示编写器线程正在等待。然后,读者线程需要在某个时刻优先于作者。

例如,在我编写的一个实现中(并不是说这是一种好方法,但它确实有效)我使用了一个标志,该标志通过原子递增/递减操作设置/清除,指示编写器线程是否正在等待锁.如果是这样,读者会推迟。当然,在那种情况下,您还需要注意相反的情况,即编写线程(如果有多个线程)可能会使读者饿死。读/写锁很棘手。

关于c++ - 读者作家 - 作家线程总是卡在多个读者线程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11596599/

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