写入位置 0x0000000000000024 时发生访问冲突。

0x00007FFD90EDD4D1 (ntdll.dll) (6Project1.exe 中)处有未经处理的异常: 0xC0000005: 写入位置 0x0000000000000024 时发生访问冲突。

操作系统 读者-写者问题
使用互斥量和信号量解决读者-写者问题。程序中设置1个写者线程,5个读者线程。

(使用VS2022)

#include<stdio.h>
#include<process.h>
#include<windows.h>
#define READER_NUM 5
CRITICAL_SECTION g_cs, g_cs_writer_count;
HANDLE g_hEventWriter, g_hEventNoReader;
int g_nReaderCount;
void ReaderPrintf(char* pszFormat, ...)
{
    va_list pArgList;
    va_start(pArgList, pszFormat);
    EnterCriticalSection(&g_cs);
    vfprintf(stdout, pszFormat, pArgList);
    LeaveCriticalSection(&g_cs);
    va_end(pArgList);
}
unsigned int __stdcall ReaderThreadFun(PVOID pM)
{
    ReaderPrintf("编号为%d的读者进入等待中...\n", GetCurrentThreadId());
    WaitForSingleObject(&g_hEventWriter, INFINITE);
    EnterCriticalSection(&g_cs_writer_count);
    g_nReaderCount++;
    if (g_nReaderCount == 1)
    {
        ResetEvent(g_hEventNoReader);
    }
    LeaveCriticalSection(&g_cs_writer_count);
    ReaderPrintf("编号为%d的读者开始读取文件...\n", GetCurrentThreadId());
    Sleep(rand() % 100);
    ReaderPrintf("编号为%d的读者结束读取文件\n", GetCurrentThreadId());
    EnterCriticalSection(&g_cs_writer_count);
    g_nReaderCount--;
    if (g_nReaderCount == 0)
        SetEvent(g_hEventNoReader);
    LeaveCriticalSection(&g_cs_writer_count);
    return 0;
}
void WriterPrintf(char* pszStr)
{
    EnterCriticalSection(&g_cs);
    printf("%s\n", pszStr);
    LeaveCriticalSection(&g_cs);
}
unsigned int __stdcall WriterThreadFun(PVOID pM)
{
    WriterPrintf("---写者线程进入等待中...");
    WaitForSingleObject(g_hEventNoReader, INFINITE);
    ResetEvent(g_hEventWriter);
    WriterPrintf("---写者开始写文件.....");
    SetEvent(g_hEventWriter);
    return 0;
}
int main()
{
    int i;
    HANDLE hThread[READER_NUM + 1];
    printf("\t读者写者问题\n");
    InitializeCriticalSection(&g_cs);
    InitializeCriticalSection(&g_cs_writer_count);
    g_hEventWriter = CreateEvent(NULL, TRUE, TRUE, NULL);
    g_hEventNoReader = CreateEvent(NULL, FALSE, TRUE, NULL);
    g_nReaderCount = 0;
    for (i = 1; i <= 2; i++)
    {
        hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL);
    }
    Sleep(50);
    for (; i < READER_NUM; i++)
        hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ReaderThreadFun, NULL, 0, NULL);
    WaitForMultipleObjects(READER_NUM + 1, hThread, TRUE, INFINITE);
    for (i = 0; i < READER_NUM + 1; i++)
        CloseHandle(hThread[i]);
    CloseHandle(g_hEventWriter);
    CloseHandle(g_hEventNoReader);
    DeleteCriticalSection(&g_cs);
    DeleteCriticalSection(&g_cs_writer_count);
    Sleep(5000);
    return 0;
}


运行结果

img

报错内容

img

把CloseHandle改为FindClose后

运行结果

img

遇到问题

img

正确的运行结果应该是

img