Windows核心编程条件变量
2023-09-14 09:07:07 时间
#include"stdafx.h"
#include<windows.h>
#include<tchar.h>
#include<vector>
#include<iostream>
#include<process.h>
using namespace std;
DWORD WINAPI ThreadProduce(PVOID pvParam);
DWORD WINAPI ThreadUser1(PVOID pvParam);
DWORD WINAPI ThreadUser2(PVOID pvParam);
vector<int> ivec;
SRWLOCK g_lock;
SRWLOCK g_lock2;
CONDITION_VARIABLE g_ConditionVar;
int _tmain()
{
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);
CloseHandle(hThread1);
CloseHandle(hThread2);
CloseHandle(hThread3);
_gettchar();
return 0;
}
DWORD WINAPI ThreadProduce(PVOID pvParam)
{
for (int i = 0; i < 10000; i++)
{
AcquireSRWLockExclusive(&g_lock); //获得SRW锁
ivec.push_back(i);
ReleaseSRWLockExclusive(&g_lock);//释放SRW锁
WakeConditionVariable(&g_ConditionVar);//因为每次执行完push_back后,容器里卖弄就会必定至少有一个元素(生产者)
//生产出东西了,这时候阻塞在Sleep*里面的线程就会被唤醒(读取者sleep线程)
Sleep(1);//停一下,让读取者先读
}
return 0;
}
DWORD WINAPI ThreadUser1(PVOID pvParam)
{
while (1)
{
AcquireSRWLockExclusive(&g_lock);
while (ivec.empty())
{
cout << "等待写入" << endl;
//如果容器是空的,也就是没有内容可以读,那么让线程进入睡眠状态,一直到调用WakeConditionAllVariable(&g_ConditionVar)
SleepConditionVariableSRW(&g_ConditionVar,&g_lock,INFINITE,0);
}
cout << "线程1:" << ivec.back() << endl;
ivec.pop_back();
ReleaseSRWLockExclusive(&g_lock);
}
return 0;
}
DWORD WINAPI ThreadUser2(LPVOID pvParam)
{
while (1)
{
AcquireSRWLockExclusive(&g_lock);
while (ivec.empty())
{
cout << "等待写入2"<<endl;
SleepConditionVariableSRW(&g_ConditionVar, &g_lock, INFINITE, 0);
}
cout << "线程2:" << ivec.back() << endl;
ivec.pop_back();
ReleaseSRWLockExclusive(&g_lock);
}
return 0;
}
相关文章
- 【windows核心编程】注入DLL时BUG排除与调试
- Perfmon - Windows 自带系统监测工具
- Windows Server 2016 部署辅助AD域控制器
- python实现windows桌面截图
- windows编程
- windows编程
- MFC Windows 程序设计[199]之文本块例程(附源码)
- MFC Windows 程序设计[122]之树形下拉列表框(附源码)
- MFC Windows 程序设计[七十七]之棋盘格着色(附源码)
- MFC Windows 程序设计[三十七]之路径选择控件(附源码)
- 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入
- Windows安装 Python详细教程
- QT应用编程: windows下使用UDT传输协议_创建工程示例(高速数据传输)
- Windows串口编程(同步异步)
- Win32 Windows编程 九
- 《windows核心编程系列》十八谈谈windows钩子
- MySQL Windows ZIP 免费安装和启动设置
- 编程误区:Windows版本检查存在的问题
- C# 获取windows特殊路径
- 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
- windows上同时安装多个版本的mysql数据库
- c#加密:一、加密概述和windows数据保护
- 在windows上安装以太坊客户端
- Windows逆向安全(一)之基础知识(十一)