对一段传扬的经典代码反思

对一段流传的经典代码反思
连接代码

http://www.cnblogs.com/moodlxs/archive/2012/02/13/2349128.html


生产者---消费者模型,信号量就可以保护资源了,为什么还要互斥体呢?

win32 多线程提到 信号量也是可以保护资源(这里是缓冲区), 而且 它的保护是特殊保护,允许有多个线程访问。

并且可以做到 不出事情。


下面的代码是网上流传的经典的 生产者--消费者 代码。 代码里有互斥体。 再看生产者--消费者 模型的题目.

生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。


题目并没有强求: 生产的时候,不允许消费,消费时候,不允许生产。

而代码加了互斥体,说明 生产的时候,只能消费。消费的时候,只能生产。

另外:可以多个人一起生产或者多个人一起消费。,实在没有看出来。







//生产者  
DWORD WINAPI Producer(LPVOID lpPara)  
{  
  while(g_continue){  
  WaitForSingleObject(g_hFullSemaphore,INFINITE);  
  WaitForSingleObject(g_hMutex,INFINITE);  
  Produce();  
  Append();  
  Sleep(1500);  
  ReleaseMutex(g_hMutex);  
  ReleaseSemaphore(g_hEmptySemaphore,1,NULL);  
  }  
  return 0;  
}  

//消费者  
DWORD WINAPI Consumer(LPVOID lpPara)  
{  
  while(g_continue){  
  WaitForSingleObject(g_hEmptySemaphore,INFINITE);  
  WaitForSingleObject(g_hMutex,INFINITE);  
  Take();  
  Consume();  
  Sleep(1500);  
  ReleaseMutex(g_hMutex);  
  ReleaseSemaphore(g_hFullSemaphore,1,NULL);  
  }  
  return 0;  
}  




------解决方案--------------------
哥哥都跟你说了,
2.可以多个人一起生产或者多个人一起消费。,实在没有看出来 ?

那是你老是把他当成单线程,博客代码可以三个生产(三个线程),就是说
一开始它就可以三个同时生产,到后面程序会根据产品的数量而决定
生产者的个数(最多三个,因为作者只创建了三个线程),消费者也是同样的道理
,不过博客里的只有一个消费者线程!