MSDN 条件变量使用例子
2017-04-12 11:20
351 查看
#include <windows.h> #include <stdlib.h> #include <stdio.h> #define BUFFER_SIZE 10 #define PRODUCER_SLEEP_TIME_MS 500 #define CONSUMER_SLEEP_TIME_MS 2000 LONG Buffer[BUFFER_SIZE]; LONG LastItemProduced; ULONG QueueSize; ULONG QueueStartOffset; ULONG TotalItemsProduced; ULONG TotalItemsConsumed; CONDITION_VARIABLE BufferNotEmpty; CONDITION_VARIABLE BufferNotFull; CRITICAL_SECTION BufferLock; BOOL StopRequested; DWORD WINAPI ProducerThreadProc (PVOID p) { ULONG ProducerId = (ULONG)(ULONG_PTR)p; while (true) { // Produce a new item. Sleep (rand() % PRODUCER_SLEEP_TIME_MS); ULONG Item = InterlockedIncrement (&LastItemProduced); EnterCriticalSection (&BufferLock); while (QueueSize == BUFFER_SIZE && StopRequested == FALSE) { // Buffer is full - sleep so consumers can get items. SleepConditionVariableCS (&BufferNotFull, &BufferLock, INFINITE); } if (StopRequested == TRUE) { LeaveCriticalSection (&BufferLock); break; } // Insert the item at the end of the queue and increment size. Buffer[(QueueStartOffset + QueueSize) % BUFFER_SIZE] = Item; QueueSize++; TotalItemsProduced++; printf ("Producer %u: item %2d, queue size %2u\r\n", ProducerId, Item, QueueSize); LeaveCriticalSection (&BufferLock); // If a consumer is waiting, wake it. WakeConditionVariable (&BufferNotEmpty); } printf ("Producer %u exiting\r\n", ProducerId); return 0; } DWORD WINAPI ConsumerThreadProc (PVOID p) { ULONG ConsumerId = (ULONG)(ULONG_PTR)p; while (true) { EnterCriticalSection (&BufferLock); while (QueueSize == 0 && StopRequested == FALSE) { // Buffer is empty - sleep so producers can create items. SleepConditionVariableCS (&BufferNotEmpty, &BufferLock, INFINITE); } if (StopRequested == TRUE && QueueSize == 0) { LeaveCriticalSection (&BufferLock); break; } // Consume the first available item. LONG Item = Buffer[QueueStartOffset]; QueueSize--; QueueStartOffset++; TotalItemsConsumed++; if (QueueStartOffset == BUFFER_SIZE) { QueueStartOffset = 0; } printf ("Consumer %u: item %2d, queue size %2u\r\n", ConsumerId, Item, QueueSize); LeaveCriticalSection (&BufferLock); // If a producer is waiting, wake it. WakeConditionVariable (&BufferNotFull); // Simulate processing of the item. Sleep (rand() % CONSUMER_SLEEP_TIME_MS); } printf ("Consumer %u exiting\r\n", ConsumerId); return 0; } int main ( void ) { InitializeConditionVariable (&BufferNotEmpty); InitializeConditionVariable (&BufferNotFull); InitializeCriticalSection (&BufferLock); DWORD id; HANDLE hProducer1 = CreateThread (NULL, 0, ProducerThreadProc, (PVOID)1, 0, &id); HANDLE hConsumer1 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)1, 0, &id); HANDLE hConsumer2 = CreateThread (NULL, 0, ConsumerThreadProc, (PVOID)2, 0, &id); puts ("Press enter to stop..."); getchar(); EnterCriticalSection (&BufferLock); StopRequested = TRUE; LeaveCriticalSection (&BufferLock); WakeAllConditionVariable (&BufferNotFull); WakeAllConditionVariable (&BufferNotEmpty); WaitForSingleObject (hProducer1, INFINITE); WaitForSingleObject (hConsumer1, INFINITE); WaitForSingleObject (hConsumer2, INFINITE); printf ("TotalItemsProduced: %u, TotalItemsConsumed: %u\r\n", TotalItemsProduced, TotalItemsConsumed); return 0; }
相关文章推荐
- VC++ MSDN中的 _beginthreadex与_endthreadex 的使用例子
- 读写锁 要写线程优先那么还可以使用条件变量的方法,具体做法可以参考msdn。
- 一段使用 mutex 和 条件变量 pthread_cond_wait 的例子
- 理解条件变量使用的一个例子
- windows中目录字符串处理函数, MSDN里有使用的例子
- !!! C++/CLI中使用using namespace System::Windows::Forms;+MessageBox报错---最重要的是看MSDN 每个函数的使用例子
- VC++ MSDN中的 _beginthreadex与_endthreadex 的使用例子
- web.config文件自定义配置节的使用方法的一个简单例子
- String和StringBuilder-使用 StringBuilder 类(MSDN)
- window.open的例子和使用方法以及参数说明(完整版)
- 使用phplib编程具体例子(转载)
- CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- 给你一个例子使用了Net::FTP
- 对收藏夹中AspectJ和Spring结合使用例子(What the teacher said (using AspectJ with Spring part II). )的补充
- 在DataGrid里面使用CheckBox的例子
- 使用委托数组的一个例子简介一下委托
- 使用JAVAMAIL发邮件的一个例子(转)
- Rave使用体会(22):Rave中连接ADO数据库的例子
- python中使用状态机的简单例子---截取'/x00'之前的字符串
- NDoc使用简要手册增加了例子代码