Windows核心编程:第8章 用户模式下的线程同步
Github
https://github.com/gongluck/Windows-Core-Program.git
//第8章 用户模式下的线程同步.cpp: 定义应用程序的入口点。
//
#include "stdafx.h"
#include "第8章 用户模式下的线程同步.h"
LONG g_i = 100;
LONG g_b = FALSE;
CRITICAL_SECTION g_cs; //关键段
SRWLOCK g_rw; //读写锁
CONDITION_VARIABLE g_cv; //条件变量
DWORD WINAPI Thread1(PVOID param)
{
for (int i = 0; i < 100; ++i)
{
EnterCriticalSection(&g_cs);
g_i += i;
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI Thread2(PVOID param)
{
for (int i = 0; i < 100; ++i)
{
if (TryEnterCriticalSection(&g_cs))
{
g_i += i;
LeaveCriticalSection(&g_cs);
}
else
SwitchToThread();
}
return 0;
}
DWORD WINAPI Thread3(PVOID param)
{
for (int i = 0; i < 100; ++i)
{
AcquireSRWLockExclusive(&g_rw);
//写
OutputDebugString(TEXT("------------AcquireSRWLockExclusive succeed.\n"));
ReleaseSRWLockExclusive(&g_rw);
}
return 0;
}
DWORD WINAPI Thread4(PVOID param)
{
for (int i = 0; i < 100; ++i)
{
AcquireSRWLockShared(&g_rw);
//读
OutputDebugString(TEXT("------------AcquireSRWLockShared succeed.\n"));
ReleaseSRWLockShared(&g_rw);
}
return 0;
}
DWORD WINAPI Thread5(PVOID param)
{
int n = 0;
for (int i = 0; i < 100; ++i)
{
EnterCriticalSection(&g_cs);
++n;
if (n >= 100)
break;
if(g_i <= 0)
SleepConditionVariableCS(&g_cv, &g_cs, INFINITE); //解锁等待条件变量,返回时再加锁
g_i--;
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI Thread6(PVOID param)
{
for (int i = 0; i < 100; ++i)
{
if (TryEnterCriticalSection(&g_cs))
{
g_i++;
WakeConditionVariable(&g_cv); //唤醒等待条件变量的线程
LeaveCriticalSection(&g_cs);
}
else
SwitchToThread();
}
return 0;
}
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
//原子操作Interlocked系列
LONG newl = InterlockedAdd(&g_i, 1);
LONG oldl = InterlockedExchange(&g_i, 10);
oldl = InterlockedCompareExchange(&g_i, 100, 10);
LONGLONG oldll = InterlockedAnd(&g_i, 0x0001);
//旋转锁!
while (InterlockedExchange(&g_b, TRUE) == TRUE)
Sleep(0);
//使用关键段
//InitializeCriticalSection(&g_cs);
BOOL bret = InitializeCriticalSectionAndSpinCount(&g_cs, 1);//初始化关键段并用上旋转锁
oldl = SetCriticalSectionSpinCount(&g_cs, 4000);
g_i = 0;
HANDLE hthread1 = CreateThread(nullptr, 0, Thread1, nullptr, 0, nullptr);
HANDLE hthread2 = CreateThread(nullptr, 0, Thread2, nullptr, 0, nullptr);
WaitForSingleObject(hthread1, INFINITE);
WaitForSingleObject(hthread2, INFINITE);
CloseHandle(hthread1);
hthread1 = nullptr;
CloseHandle(hthread2);
hthread2 = nullptr;
//使用读写锁
InitializeSRWLock(&g_rw);
HANDLE hthread3 = CreateThread(nullptr, 0, Thread3, nullptr, 0, nullptr);
HANDLE hthread4 = CreateThread(nullptr, 0, Thread4, nullptr, 0, nullptr);
WaitForSingleObject(hthread3, INFINITE);
WaitForSingleObject(hthread4, INFINITE);
CloseHandle(hthread3);
hthread3 = nullptr;
CloseHandle(hthread4);
hthread4 = nullptr;
//条件变量(误入锁?)
InitializeConditionVariable(&g_cv);
g_i = 0;
HANDLE hthread5 = CreateThread(nullptr, 0, Thread5, nullptr, 0, nullptr);
HANDLE hthread6 = CreateThread(nullptr, 0, Thread6, nullptr, 0, nullptr);
WaitForSingleObject(hthread5, INFINITE);
WaitForSingleObject(hthread6, INFINITE);
CloseHandle(hthread5);
hthread5 = nullptr;
CloseHandle(hthread6);
hthread6 = nullptr;
DeleteCriticalSection(&g_cs);
system("pause");
return 0;
}
Windows核心编程:第8章 用户模式下的线程同步的更多相关文章
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- 《Windows核心编程》第八章——用户模式下的线程同步
下面起了两个线程,每个对一个全局变量加500次,不假思索进行回答,会认为最后这个全局变量的值会是1000,然而事实并不是这样: #include<iostream> #include &l ...
- 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)
8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...
- 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)
8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...
- 第8章 用户模式下的线程同步(1)_Interlocked系列函数
8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...
- 《Windows核心编程》第九章——用内核对象进行线程同步
先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using n ...
- 第8章 用户模式下的线程同步(2)_临界区(CRITICAL_SECTION)
8.4 关键段(临界区)——内部也是使用Interlocked函数来实现的! 8.4.1 关键段的细节 (1)CRITICAL_SECTION的使用方法 ①CRITICAL_SECTION cs; ...
- 《windows核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
随机推荐
- eclipse中tomcat调试正确关联源码
1.build path中jar包关联本地源码 2.tomcat中添加source关联工程lib下的jar包 以上两步即可. 可解决tomcat直接关联本地源码debug时无法计算表达式的情况. 错误 ...
- 什么是DevOps?DevOps简明教程
我希望每个测试人员经过..功能测试-接口测试-安全测试-自动化测试-性能测试的洗礼后 都可以进入DevOps阶段.具体什么以及为什么 我稍后会给你大家讲解...
- 2017/2/14:JSTL标签与el表达式
一.JSTL标签介绍 1.什么是JSTL? JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是 ...
- one or more
想到以后如果一直都是这样,那么以后的生活是多么多么可怕啊. 感觉毫无期盼.没有意义. 如果变得理所当然那是多么多么让人害怕的事,吓得让人发抖. 所以在以后漫长的岁月里,还是一个人吧 如果相互看不惯,感 ...
- 35、输入框(UITextField)密码明暗文切换
- (IBAction)pwdTextSwitch:(UIButton *)sender { // 前提:在xib中设置按钮的默认与选中状态的背景图 // 切换按钮的状态 sender.selecte ...
- c++关键字volatile的作用
1.易变性 1.1概念 编译器对volatile修饰的变量,当要读取这个变量时,任何情况下都会从内存中读取,而不会从寄存器缓存中读取(因为每次都从内存中读取体现出变量的“易变”) 1.2测试代码(VS ...
- Python-类-dict
class dict(object): """ dict() -> new empty dictionary dict(mapping) -> new dic ...
- Mybatis-Plus 实战完整学习笔记(九)------条件构造器核心用法大全(上)
一.Mybatisplus通用(公共方法)CRUD,一共17种(3.0.3版),2.3系列也是这么多,这个新版本一定程度进行了改造和删减. 二.构造器UML图(3.0.3)-----实体包装器,主要用 ...
- pageshow和pagehide事件
Firefox和opera有一个特性,往返缓存:可以在用户使用浏览器的后退和前进按钮时加快页面的转换速度,这个缓存不仅保存了页面的数据,还有DOM和JavaScript的状态. 为了更形象的说明bfc ...
- css3实现切片动画
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta http- ...