2

私は Windows OS を学んでいて、標準的なコンシューマー プロデューサーの問題を書いていました。リソースカウント用のセマフォと同期用のミューテックスがあります。CreateSemaphore() で最大カウント 50 の値を渡したので、プロデューサーが 50 を超えるリソースを作成できないようにする必要があります。しかし、コードを実行しているときは、それをはるかに超えています。max count 引数の使用を間違って理解しましたか?? コードも貼っておきます。この問題を解決するのを手伝ってください。

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

DWORD WINAPI consumerThread(LPVOID args);
DWORD WINAPI producerThread(LPVOID args);

int shared;
HANDLE hMutex;
HANDLE hSemaphore;
HANDLE hConsumer;
HANDLE hProducer;
DWORD dwConsumerId,dwProducerId;

#define MAX_COUNT 50
#define MIN_COUNT 0
int main()
{
    if(!(hMutex=CreateMutex(NULL,0,NULL)))
    {
        puts("Error:: unable to create Mutex!!");
        ExitProcess(GetLastError());
    }
    if(!(hSemaphore=CreateSemaphore(NULL,MIN_COUNT,MAX_COUNT,NULL)))
    {
        puts("Error:: unable to create Semaphore object!!");
        ExitProcess(GetLastError());
    }
    if(!(hConsumer=CreateThread(NULL,0,consumerThread,NULL,0,&dwConsumerId)))
    {
        puts("Error:: unable to create consumer Thread!!");
        ExitProcess(GetLastError());
    }
    if(!(hProducer=CreateThread(NULL,0,producerThread,NULL,0,&dwProducerId)))
    {
        puts("Error:: unable to create producer Thread!!");
        ExitProcess(GetLastError());
    }
    WaitForSingleObject(hConsumer,INFINITE);
    WaitForSingleObject(hProducer,INFINITE);
    CloseHandle(hMutex);
    CloseHandle(hSemaphore);
    CloseHandle(hConsumer);
    CloseHandle(hProducer);
    return 0;
}

DWORD WINAPI consumerThread(LPVOID args)
{

    while(1)
    {
        WaitForSingleObject(hSemaphore,INFINITE);
        WaitForSingleObject(hMutex,INFINITE);
        shared--;
        printf("Consumer  = %d\n",shared);
        ReleaseMutex(hMutex);
        //Sleep(1000);
    }
}

DWORD WINAPI producerThread(LPVOID args)
{
    if(!SetThreadPriority(hProducer,THREAD_PRIORITY_HIGHEST))
    {
        printf("Error:: Unable to set the thread priority level!!\n");
        ExitProcess(GetLastError());
    }
    while(1)
    {
        WaitForSingleObject(hMutex,INFINITE);
        shared++;
        printf("Producer =%d\n",shared);
        ReleaseMutex(hMutex);
            ReleaseSemaphore(hSemaphore,1,NULL);


    }
}
4

1 に答える 1

2

この質問は、@Hans Passant と @Igor Tandetnik のコメントで回答されています。そして要点は、lmaxcount 引数で指定された値を超えてセマフォの値をインクリメントしようとすると、呼び出し元のスレッドをブロックする代わりに、ReleaseSemaphore() API が失敗することです。私がそれをしなかったので、戻り値を確認して問題に陥る必要があります。:)

于 2013-09-11T09:47:11.090 に答える