您的位置:首页 > 编程语言 > C语言/C++

一个简单的C语言操作系统生产者消费者模型

2010-06-22 21:37 387 查看
#include <stdio.h>

#include <windows.h>

#include <conio.h>

#include <stdlib.h>

#include <time.h>

#define SIZE_OF_BUFFER 8

//一个生产者一个消费者

DWORD WINAPI Producer(LPVOID param);

DWORD WINAPI Consumer(LPVOID param);

void ErrorForHandle(HANDLE handle);

int getRandNum();

void init();

HANDLE thread1,thread2;

DWORD threadID1,threadID2;

HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待

HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待

HANDLE mutex;

//缓冲池大小

DWORD itemNum;

int endThreadFlag = 0;

void main()

{

printf("演示过程中请按回车键结束/n按回车开始演示/n");

getch();

itemNum = 0;

g_hFullSemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);

ErrorForHandle(g_hFullSemaphore);

g_hEmptySemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);

ErrorForHandle(g_hEmptySemaphore);

mutex = ::CreateMutex(NULL,FALSE,NULL);

ErrorForHandle(mutex);

thread1 = ::CreateThread(NULL,0,Producer,NULL,0,&threadID1);

ErrorForHandle(thread1);

thread2 = ::CreateThread(NULL,0,Consumer,NULL,0,&threadID2);

ErrorForHandle(thread2);

getch();

endThreadFlag = 1;

//关闭句柄

CloseHandle(g_hFullSemaphore);

CloseHandle(g_hEmptySemaphore);

CloseHandle(mutex);

CloseHandle(thread1);

CloseHandle(thread2);

}

DWORD WINAPI Producer(LPVOID param)

{

while(!endThreadFlag)

{

::WaitForSingleObject(g_hEmptySemaphore,INFINITE);

::WaitForSingleObject(mutex,INFINITE);

itemNum ++;

printf("生产者生产产品,当前产品总数为 %d/n",itemNum);

::ReleaseMutex(mutex);

::ReleaseSemaphore(g_hFullSemaphore,1,NULL);

Sleep(getRandNum());

}

return 0;

}

DWORD WINAPI Consumer(LPVOID param)

{

while(!endThreadFlag)

{

::WaitForSingleObject(g_hFullSemaphore,INFINITE);

::WaitForSingleObject(mutex,INFINITE);

itemNum --;

printf("消费者消费产品 ,当前产品总数为%d/n",itemNum);

::ReleaseMutex(mutex);

::ReleaseSemaphore(g_hEmptySemaphore,1,NULL);

Sleep(getRandNum());

}

return 0;

}

//定义由于句柄分配引起的错误处理

void ErrorForHandle(HANDLE handle)

{

if(handle == INVALID_HANDLE_VALUE)

{

printf("句柄分配错误/n");

::exit(0);

}

}

//初始化操作

void init()

{

//得到随机种子

time_t t;

srand(unsigned(time(&t)));

}

//得到一个随机数

int getRandNum()

{

int num;

num = rand() % 2000 +1;

return num;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: