条件变量__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
- 条件变量__Windows核心编程
- windows核心编程-条件变量
- PTHREAD编程--条件变量
- 多线程编程-条件变量
- 多线程编程: 条件变量
- 多线程编程-条件变量
- Windows核心编程之 用户模式下的线程同步 读写锁和条件变量
- Linux多线程编程-条件变量
- linux多线程编程---条件变量
- 多线程编程-条件变量pthread_cond_t
- Linux多线程编程-条件变量
- Linux多线程编程---条件变量
- boost多线程编程条件变量
- 互斥量 信号量 条件变量编程
- c++ 多线程编程 条件变量
- 线程编程之条件变量
- linux编程---线程---条件变量
- Python核心编程----条件和循环
- 成功开通博客!
- java观察者模式-使用java观察者模式的支持
- MySQL 加锁处理分析
- C++中的默认函数与default和delete用法
- IOS 开发学习十八 包管理工具 CocoaPods的使用
- 条件变量__Windows核心编程
- c++数据结构——队列
- (14)树莓派B+使用L298N驱动控制四驱车并实现一个简单的web控制端
- Mac下app的table拖放实现s
- 自己动手写编译器之TINY编译器词法分析
- 《Java程序设计》第一次作业:源代码计算器
- 名科全数字纯数字网络IP楼宇对讲系统说明
- kendoGrid单击、双击事件绑定并获取当前行数据
- Fragment