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章 用户模式下的线程同步的更多相关文章

  1. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  2. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  3. 《Windows核心编程》第八章——用户模式下的线程同步

    下面起了两个线程,每个对一个全局变量加500次,不假思索进行回答,会认为最后这个全局变量的值会是1000,然而事实并不是这样: #include<iostream> #include &l ...

  4. 第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)

    8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程( ...

  5. 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)

    8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...

  6. 第8章 用户模式下的线程同步(1)_Interlocked系列函数

    8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...

  7. 《Windows核心编程》第九章——用内核对象进行线程同步

    先举一个有bug的例子: #include <iostream> #include <windows.h> #include <process.h> using n ...

  8. 第8章 用户模式下的线程同步(2)_临界区(CRITICAL_SECTION)

    8.4 关键段(临界区)——内部也是使用Interlocked函数来实现的! 8.4.1 关键段的细节 (1)CRITICAL_SECTION的使用方法 ①CRITICAL_SECTION cs;   ...

  9. 《windows核心编程系列》七谈谈用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

随机推荐

  1. The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone问题解决

    从错误即可知道是时区的错误,因此只要将时区设置为你当前系统时区即可 因此使用root用户登录mysql,按照如下图所示操作即可. 把时区设置为所在地时区(即东八区的时区)后,再连接数据库就可以了

  2. Spring ApplicationContext(六)BeanPostProcessor

    Spring ApplicationContext(六)BeanPostProcessor 产生回顾一下 ApplicationContext 初始化的几个步骤:第一步是刷新环境变量:第二步是刷新 b ...

  3. nginx记录post数据日志

    1.vi nginx.conf 找到http {}中log_foramt ,定义post 日志格式 #log_format main '$remote_addr - $remote_user [$ti ...

  4. 《MinDoc 接口文档在线管理系统》

    项目简介 MinDoc 是一款针对IT团队开发的简单好用的文档管理系统. MinDoc 的前身是 SmartWiki 文档系统.SmartWiki 是基于 PHP 框架 laravel 开发的一款文档 ...

  5. OpenCV-图像通道转换问题

    OpenCV-MAT对象中使用plt.imshow(img[:,:,::-1])如何实现将第二轴反向? 系统平台:win10 x64 一.明确几个概念: 1.OpenCV内部每个通道并没有固定对应某种 ...

  6. centos 7 禁止root登录及更改ssh端口号

    vim /etc/ssh/sshd_config PermitRootLogin yes => PermitRootLogin no systemctl restart sshd.service ...

  7. 使用Hadoop API 解压缩 HDFS文件

    接上篇:使用Hadoop API 压缩HDFS文件 压缩完了,当然需要解压缩了. 直接上代码: private static void getFile(String filePath) throws ...

  8. 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的矩阵中的左下角,放置一个车(车可以移动到同一行或同一列),放置一些墙,竖的占据 ...

  9. Latex表格插入

    \begin{table}[h] \centering \caption{Traffic flows description} \begin{tabular}{|c||c|c|c|c|} \hline ...

  10. POJ 3110 Jenny's First Exam (贪心)

    题意:告诉你n 个科目的考试日期,在考试当天不能复习,每一个科目的最早复习时间不能早于考试时间的t天,每一天你可以复习完一科,也只能复习一科,求最晚的复习时间!. 析:由于题目给定的时间都在1900 ...