logo资料库

操作系统实验生产者与消费者实验报告及代码.doc

第1页 / 共5页
第2页 / 共5页
第3页 / 共5页
第4页 / 共5页
第5页 / 共5页
资料共5页,全文预览结束
实验二:进程的互斥与同步 (生产者与消费者问题) 一、实验目的: 利用 Windows 提供的 API 函数,编写程序,解决生产者与消费者问题,实 现进程的互斥与同步。 二、实验内容: 创建一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用 10 个不同的缓冲区。生产者线程生产一个产品,并把产品放进缓冲区中;消费者消 费一个产品,并从缓冲区中取出一个产品,释放该缓冲区。 本实验设计并使用了如下信号量: (1)一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; (2)一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出 信号; (3)一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发 出信号; 生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线 程释放出一个空缓冲区;消费者线程消费物品时,若缓冲区为空,消费者线程将 被阻塞,直到新的物品被生产出来。 三、主要程序结构: 1.使用到的 windows 提供的 API 函数 CreateThread():创建一个在调用进程的地址空间中执行的线程。 CreateMutex ():创建有名或无名的互斥对象。 ReleaseMutex ():释放指定互斥对象。 WaitForSingleObject():测试指定对象是否有信号或超时 CreateSemapore():创建一个有名或者无名信号对象。 ReleaseSemaphore():将指定信号对象的计数增加一个指定的数量。 2.创建的自定义函数 Produce() :生产一个产品。 Consume() :消费一个产品。 Append():把新生产的产品放入缓冲区。 Take():从缓冲区中取出一个产品。 3. 创建的线程 DWORD WINAPI Producer(LPVOID lpPara):生产者线程 DWORD WINAPI Consumer(LPVOID lpPara) :消费者线程 四、实验步骤 1.对缓冲区长度,互斥信号等常量声明。 2.创建各个互斥信号。 3.创建生产者和消费者线程。 4.进行生产和消费。 五、实验截图
六、实验源代码 #include #include #include const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度 unsigned short ProductID = 0; //产品号 unsigned short ConsumeID = 0; //将被消耗的产品号 unsigned short in = 0; //产品进缓冲区时的缓冲区下标 unsigned short out = 0; //产品出缓冲区时的缓冲区下标 int m_s_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列
bool m_s_continue = true; //控制程序结束 HANDLE m_s_hMutex; //用于线程间的互斥 HANDLE m_s_hFullSemaphore; //当缓冲区满时迫使生产者等待 HANDLE m_s_hEmptySemaphore; //当缓冲区空时迫使消费者等待 DWORD WINAPI Producer(LPVOID); //生产者线程 DWORD WINAPI Consumer(LPVOID); //消费者线程 int main() { //创建各个互斥信号 m_s_hMutex = CreateMutex(NULL,FALSE,NULL); m_s_hFullSemaphore CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL); m_s_hEmptySemaphore CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); const unsigned short PRODUCERS_COUNT = 3; //生产者的个数 const unsigned short CONSUMERS_COUNT = 1; //消费者的个数 //总的线程数 const unsigned short THREADS_COUNT PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreads[PRODUCERS_COUNT]; //各线程的 handle DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符 DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符 = = = //创建生产者线程 for (int i=0;i
while(m_s_continue){ if(getchar()){ //按回车后终止程序运行 m_s_continue = false; } } return 0; } void Produce() { } cout<< "生产一个产品" << ++ProductID<<"成功" << endl; void Append() { cout << "把新生产的产品放入缓冲区"<
if (i==out) cout << endl; cout << " <-- 消费"; } } void Consume() { cout << "消费一个产品 " << ConsumeID+1<<"成功"<
分享到:
收藏