读书人

生产者与消费者的有关问题

发布时间: 2012-03-08 13:30:13 作者: rapoo

生产者与消费者的问题
代码如下:

C/C++ code
# include <windows.h># include <stdio.h>HANDLE g_hSemaphore;int g_Count = 0, i = 1; //i用做标记,DWORD WINAPI Producer(LPVOID lpParam){    while(TRUE)    {        WaitForSingleObject(g_hSemaphore, INFINITE);        if(g_Count > 4)        {            i = 0; //i = 0表示当消费者消费完所有窝头的时候,就可以退出了            ReleaseSemaphore(g_hSemaphore, 1, NULL);            break;        }        g_Count++;        printf("生产了一个,目前共有:%d 个\n", g_Count);        ReleaseSemaphore(g_hSemaphore, 1, NULL);    }    return 0;}DWORD WINAPI Consumer(LPVOID lpParam){    while(TRUE)    {        WaitForSingleObject(g_hSemaphore, INFINITE);        if((g_Count < 1) && (i == 0))        {            ReleaseSemaphore(g_hSemaphore, 1, NULL);            break;        }        if(g_Count < 1)            continue;        g_Count--;        printf("消费了一个,目前剩余:%d 个\n", g_Count);        ReleaseSemaphore(g_hSemaphore, 1, NULL);    }    return 0;}int main(){    g_hSemaphore = CreateSemaphore(NULL, 1, 2, NULL); //创建一个信号量对象,最大资源数为2,当前资源数为1        HANDLE hConsumer, hProducer;    hProducer = CreateThread(NULL, 0, Producer, NULL, 0, NULL); //创建“生产者”线程    hConsumer = CreateThread(NULL, 0, Consumer, NULL, 0, NULL); //创建“消费者”线程        CloseHandle(hConsumer);    CloseHandle(hProducer);    Sleep(1000); //主线程睡眠1秒    CloseHandle(g_hSemaphore);    return 0;}



我要实现的是就是线程中的生产者与消费者,假设我们来生产窝头,开始的时候没有窝头,于是开始生产,当窝头的数量大于0的时候,消费者就可以消费这个窝头了,当生产的窝头数量多于5个时候,生产线程退出,当消费者消费完窝头的时候,消费者线程退出。可是这个输出结果有时却是这样,想不明白为什么:

生产了一个,目前共有:4 个 //这块就很奇怪,怎么第一次输出就是4呢?
消费了一个,目前剩余:3 个
生产了一个,目前共有:4 个
消费了一个,目前剩余:3 个
生产了一个,目前共有:4 个
消费了一个,目前剩余:3 个
... ... ... ....

[解决办法]
这个是操作系统里的信号量机制吧!!
[解决办法]
生产的时候要加锁吧,在g_Count++;前后要加信号量的,消费的时候也一样
[解决办法]
临界资源
[解决办法]
关键资源没加锁咧

读书人网 >C++

热点推荐