就是操作系统的实验,代码在这备份一下0.0
#include <windows.h> #include <stdio.h> //getchar() #include <stdlib.h> //rand() const int SIZE_OF_BUFFER = 10; //缓冲区长度 int ProductID = 0; //产品号 int ConsumeID = 0; //将被消耗的产品号 int in = 0; //产品进缓冲区时的下标 int out = 0; //产品出缓冲区时的下标 int g_buffer[10]; //缓冲区,长度等于SIZE_OF_BUFFER int g_continue = 1; //控制程序结束 HANDLE g_hMutex; //用于线程间的互斥 HANDLE g_hFullItems; //缓冲区中被占用的项 HANDLE g_hEmptyItems; //缓冲区中的空项 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程 void Produce(); void Append(); void Take(); void Consume(); int main() { int i; const int PRODUCERS_COUNT =3; //生产者的个数 const int CONSUMERS_COUNT =2; //消费者的个数 //总的线程数 const int THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE *hThreads = (HANDLE*)malloc(sizeof(HANDLE)*THREADS_COUNT); //各线程的handle DWORD *producerID = (DWORD*)malloc(sizeof(DWORD)*PRODUCERS_COUNT); //生产者线程的标识符 DWORD *consumerID = (DWORD*)malloc(sizeof(DWORD)*CONSUMERS_COUNT); //消费者线程的标识符 //创建各个互斥信号 g_hMutex = CreateMutex(NULL,FALSE,NULL); g_hFullItems = CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);//创建信号灯,createsemaphore常常被用作多线程同步 g_hEmptyItems = CreateSemaphore(NULL,SIZE_OF_BUFFER, SIZE_OF_BUFFER,NULL); //缓冲区初始化 for (i = 0; i< SIZE_OF_BUFFER;++i) { g_buffer[i] = -1; //当值为-1时该项为空 } //创建生产者线程 for ( i=0;i<PRODUCERS_COUNT;++i){ hThreads[i] =CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);//CreateThread��window提供的API函数 if (hThreads[i]==NULL) return -1; //用此函数可创建一个线程 } //创建消费者线程 for (i=0;i<CONSUMERS_COUNT;++i){ hThreads[PRODUCERS_COUNT+i] =CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]); if (hThreads[i]==NULL) return -1; } while(g_continue){ if(getchar()){ //按回车后终止程序运行 g_continue = 0; } } return 0; } //生产者 DWORD WINAPI Producer(LPVOID lpPara) { while(g_continue){ int i=rand()%5; Sleep(i*1000); WaitForSingleObject(g_hEmptyItems,INFINITE) ;//等待信号灯 WaitForSingleObject(g_hMutex,INFINITE) ; Produce(); Append(); ReleaseMutex(g_hMutex) ; ReleaseSemaphore(g_hFullItems,1,NULL) ; } return 0; } //消费者 DWORD WINAPI Consumer(LPVOID lpPara) { while(g_continue){ int i=rand()%5; Sleep(i*1000);//该线程释放当前的控制权1500毫秒,让系统调度其他线程 WaitForSingleObject(g_hFullItems,INFINITE) ; WaitForSingleObject(g_hMutex,INFINITE) ; Take(); Consume(); ReleaseMutex(g_hMutex) ; ReleaseSemaphore(g_hEmptyItems,1,NULL) ; } return 0; } //生产一个产品。简单模拟了一下,仅输出新产品的ID号 void Produce() { printf("\nProducing %d ...", ++ProductID); printf("Succeed\n"); } //把新生产的产品放入缓冲区 void Append() { int i; printf("Appending a product ..."); g_buffer[in] = ProductID; in = (in+1)%SIZE_OF_BUFFER; printf("Succeed\n"); //输出缓冲区当前的状态 for (i=0;i<SIZE_OF_BUFFER;++i) { printf("%d:",i); if (g_buffer[i]==-1) printf("null"); else printf("%d",g_buffer[i]); if (i==in) printf("\t<-- 生产"); if (i==out) printf("\t<-- 消费"); printf("\n"); } } //从缓冲区中取出一个产品 void Take() { int i; printf("\nTaking a product ..."); ConsumeID = g_buffer[out]; g_buffer[out]= -1; out = (out+1)%SIZE_OF_BUFFER; printf("%d--Succeed\n", ConsumeID); //输出缓冲区当前的状态 for (i=0;i<SIZE_OF_BUFFER;++i){ printf("%d:",i); if (g_buffer[i]==-1) printf("null"); else printf("%d",g_buffer[i]); if (i==in) printf("\t<-- 生产"); if (i==out) printf("\t<-- 消费"); printf("\n"); } } //消耗一个产品 void Consume() { printf("Consuming %d ", ConsumeID); printf("Succeed\n"); }