对一段传扬的经典代码反思
对一段流传的经典代码反思
连接代码
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.可以多个人一起生产或者多个人一起消费。,实在没有看出来 ?
那是你老是把他当成单线程,博客代码可以三个生产(三个线程),就是说
一开始它就可以三个同时生产,到后面程序会根据产品的数量而决定
生产者的个数(最多三个,因为作者只创建了三个线程),消费者也是同样的道理
,不过博客里的只有一个消费者线程!
连接代码
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.可以多个人一起生产或者多个人一起消费。,实在没有看出来 ?
那是你老是把他当成单线程,博客代码可以三个生产(三个线程),就是说
一开始它就可以三个同时生产,到后面程序会根据产品的数量而决定
生产者的个数(最多三个,因为作者只创建了三个线程),消费者也是同样的道理
,不过博客里的只有一个消费者线程!