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核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
随机推荐
- Java中的四种内部类
Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...
- Composer 中文镜像 Lavavel-china 公益项目
『Composer 中国全量镜像』是由 Laravel China 社区联合 又拍云 与 优帆远扬 共同合作推出的公益项目,旨在为广大 PHP 用户提供稳定和高速的 Composer 国内镜像服务. ...
- Wordvec_句子相似度
import jiebafrom jieba import analyseimport numpyimport gensimimport codecsimport pandas as pdimport ...
- 学习python 多进程和多线程
''' 学习多进程和多线程 ''' import multiprocessing def deadLoop(): while True: pass if __name__ == '__main__': ...
- mysql之多表查询和pymysql模块
一 多表查找方法 1 交叉连接:不使用任何的判断条件,生成笛卡尔积.第一个表的行数乘以第二个表的行数就等于笛卡尔积结果集的行数. mysql> select * from student,cla ...
- 01.Java 开发简单的计算器
难度为一般,适合具有 Java 基础和 Swing 组件编程知识的用户学习一. 实验介绍1.1 实验内容本次实验利用Java开发一个可以进行简单的四则运算的图形化计算器,会使用到 Java Swing ...
- java常用设计模式八:代理模式
一.概述 代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象. 其特征是代理类与委托类有同样的接口,真正的核心业务逻辑还是在实际对象里面. 二.为什么要使用代理模式 当 ...
- myeclipse安装svn方法汇总
myeclipse安装svn方法汇总 博客分类: eclipse MyEclipse6.5安装SVN插件,掌握了几种方法,本节就像大家介绍一下MyEclipse6.5安装SVN插件的三种方法,看完 ...
- i2c触摸屏驱动文件的实现
转自:http://blog.chinaunix.net/uid-29507718-id-4314013.html Linux下I2C接口触摸屏驱动分析 分类: LINUX linux下触摸屏驱动的 ...
- css3 box-sizing详解。
人们慢慢的意识到传统的盒子模型不直接,所以他们新增了一个叫做 box-sizing 的CSS属性. box-sizing: 盒大小,盒模型. 我们经常遇到左右模块宽度为50%,加个边框会掉下去,加一个 ...