条件变量__Windows核心编程

来源:互联网 发布:apache spark 加载数据 编辑:程序博客网 时间:2024/06/01 08:01

#include "stdafx.h"#include <windows.h>#include <iostream>#include <vector>#include <process.h>using namespace std;DWORD WINAPI ThreadProduce(PVOID pvParam);DWORD WINAPI ThreadUser1(PVOID pvParam);DWORD WINAPI ThreadUser2(PVOID pvParam);DWORD WINAPI ThreadUser3(PVOID pvParam);DWORD WINAPI ThreadUser4(PVOID pvParam);vector<int> ivec;SRWLOCK g_lock;//读写锁CONDITION_VARIABLE g_ConditionVarProduce;//条件变量CONDITION_VARIABLE g_ConditionVarRead ;CONDITION_VARIABLE g_ConditionVarConsume;int main(int argc, _TCHAR* argv[]){InitializeSRWLock(&g_lock);//初始化锁//创建生产者HANDLE hThread1 = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void*))ThreadProduce,NULL,0,0);//创建消费者HANDLE hThread2 = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void*))ThreadUser1,NULL,0,0);HANDLE hThread3 = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall *)(void*))ThreadUser2,NULL,0,0);//创建读取线程HANDLE hThread4 = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall*)(void*))ThreadUser3,NULL,0,0);HANDLE hThread5 = (HANDLE)_beginthreadex(NULL,0,(unsigned int(_stdcall*)(void*))ThreadUser4,NULL,0,0);CloseHandle(hThread1);CloseHandle(hThread2);CloseHandle(hThread3);CloseHandle(hThread4);CloseHandle(hThread5);system("pause");return 0;}/*@函数名:ThreadProduce@description:生产者线程@parameter:pvParam此为一个写入线程*/DWORD WINAPI ThreadProduce(PVOID pvParam){for(int i=0; i<10; ++i){AcquireSRWLockExclusive(&g_lock);  //获得SRW 锁if(ivec.size()>5)//超过5个则停止SleepConditionVariableSRW(&g_ConditionVarProduce,&g_lock,INFINITE,0);ivec.push_back(i);//添加数据到向量cout<<"写入线程"<<i<<endl;ReleaseSRWLockExclusive(&g_lock);  //释放SRW锁WakeConditionVariable(&g_ConditionVarRead);  //因为,每次执行push_back 后,容器里就会必定至少有一个元素(生产者                                                 //生产出东西了)这时候阻塞在Sleep*里的线程被唤醒 (读取者sleep的线程)。Sleep(1000);//停一下,让读取者先读}return 0;}/*@函数名:ThreadUser1@description:消费者线程@parameter:pvParam此为一个写入线程*/DWORD WINAPI ThreadUser1(PVOID pvParam){while(1){AcquireSRWLockExclusive(&g_lock);while(ivec.empty()){cout<<"等待写入"<<endl;//如果容器是空的,也就是没有内容可以读,那么让线程进入睡眠状态,一直到调用WakeConditionAllVariable(&g_ConditionVar);SleepConditionVariableSRW(&g_ConditionVarConsume,&g_lock,INFINITE,0);}cout<<"线程1:"<<ivec.back()<<endl;ivec.pop_back();ReleaseSRWLockExclusive(&g_lock);//唤醒生产者线程WakeConditionVariable(&g_ConditionVarProduce);}return 0;}/*@functionName ThreadUser2@description : 消费者线程,也是写入线程@parameter: pvParam*/DWORD WINAPI ThreadUser2(PVOID pvParam){while(1){AcquireSRWLockExclusive(&g_lock);while(ivec.empty()){cout<<"等待写入"<<endl;//写入者线程,应该传入0,表示希望独占资源的访问SleepConditionVariableSRW(&g_ConditionVarConsume,&g_lock,INFINITE,0);}cout<<"线程2:"<<ivec.back()<<endl;ivec.pop_back();ReleaseSRWLockExclusive(&g_lock);//唤醒生产者线程WakeConditionVariable(&g_ConditionVarProduce) ;}return 0;}/*@functionName:ThreadUser3@description: 读取者线程@parameter:pvParam        此为读取者线程*/DWORD WINAPI ThreadUser3(PVOID pvParam){while(1){AcquireSRWLockShared(&g_lock);if(ivec.empty())//对于读取者线程来说,应该传入CONDITION_VARIABLE_LOCKMODE_SHARED,表示希望共享对资源的访问SleepConditionVariableSRW(&g_ConditionVarRead,&g_lock,INFINITE,CONDITION_VARIABLE_LOCKMODE_SHARED);cout<<"线程3:"<<ivec.back()<<endl;ReleaseSRWLockShared(&g_lock);//唤醒消费者线程WakeConditionVariable(&g_ConditionVarConsume);Sleep(1000);}return 0;}/*@functionName:ThreadUser4@description: 读取者线程@parameter:pvParam        此为读取者线程*/DWORD WINAPI ThreadUser4(PVOID pvParam){while(1){AcquireSRWLockShared(&g_lock);if(ivec.empty())//对于读取者线程来说,应该传入CONDITION_VARIABLE_LOCKMODE_SHARED,表示希望共享对资源的访问SleepConditionVariableSRW(&g_ConditionVarRead,&g_lock,INFINITE,CONDITION_VARIABLE_LOCKMODE_SHARED);cout<<"线程4:"<<ivec.back()<<endl;ReleaseSRWLockShared(&g_lock);WakeConditionVariable(&g_ConditionVarConsume);Sleep(1000);}return 0;}

输出结果:

写入线程0线程1:0等待写入等待写入请按任意键继续. . . 写入线程1线程4:1线程1:1等待写入写入线程2线程3:2线程4:2线程2:2等待写入等待写入写入线程3线程3:3线程4:3线程2:3等待写入等待写入写入线程4线程3:4线程4:4线程2:4等待写入等待写入写入线程5线程3:5线程4:5线程2:5等待写入等待写入写入线程6线程3:6线程4:6线程2:6等待写入等待写入写入线程7线程3:7线程2:7等待写入写入线程8线程4:8线程3:8线程1:8等待写入等待写入写入线程9线程4:9线程1:9等待写入




0 0
原创粉丝点击