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核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
随机推荐
- The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone问题解决
从错误即可知道是时区的错误,因此只要将时区设置为你当前系统时区即可 因此使用root用户登录mysql,按照如下图所示操作即可. 把时区设置为所在地时区(即东八区的时区)后,再连接数据库就可以了
- Spring ApplicationContext(六)BeanPostProcessor
Spring ApplicationContext(六)BeanPostProcessor 产生回顾一下 ApplicationContext 初始化的几个步骤:第一步是刷新环境变量:第二步是刷新 b ...
- nginx记录post数据日志
1.vi nginx.conf 找到http {}中log_foramt ,定义post 日志格式 #log_format main '$remote_addr - $remote_user [$ti ...
- 《MinDoc 接口文档在线管理系统》
项目简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统. MinDoc 的前身是 SmartWiki 文档系统.SmartWiki 是基于 PHP 框架 laravel 开发的一款文档 ...
- OpenCV-图像通道转换问题
OpenCV-MAT对象中使用plt.imshow(img[:,:,::-1])如何实现将第二轴反向? 系统平台:win10 x64 一.明确几个概念: 1.OpenCV内部每个通道并没有固定对应某种 ...
- centos 7 禁止root登录及更改ssh端口号
vim /etc/ssh/sshd_config PermitRootLogin yes => PermitRootLogin no systemctl restart sshd.service ...
- 使用Hadoop API 解压缩 HDFS文件
接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) C. The Tower is Going Home(思维+双指针)
https://codeforces.com/contest/1075/problem/C 题意 一个宽为1e9*1e9的矩阵中的左下角,放置一个车(车可以移动到同一行或同一列),放置一些墙,竖的占据 ...
- Latex表格插入
\begin{table}[h] \centering \caption{Traffic flows description} \begin{tabular}{|c||c|c|c|c|} \hline ...
- POJ 3110 Jenny's First Exam (贪心)
题意:告诉你n 个科目的考试日期,在考试当天不能复习,每一个科目的最早复习时间不能早于考试时间的t天,每一天你可以复习完一科,也只能复习一科,求最晚的复习时间!. 析:由于题目给定的时间都在1900 ...