Windows核心编程<读书笔记八>线程的同步
2011-12-03 21:29
232 查看
【文起】亲爱的蟹儿,想念你就是我坚持下去的动力。为了每天能一起喝红酒,奋斗,嘻嘻
用户方式中线程的同步
1、 当系统中的线程对同一共享资源进行读取时,就会涉及线程的同步,也就是线程间的相互通信。
2、 原子访问:互锁
为了保证同一时间内只有一个线程在访问共享资源,我们一般会建立互锁函数。如函数
LONG InterlockedExchangeAdd(PLONG plTarget,LONG lVaule);就会以原子访问形式给传入的地址的值加或减相应的值。
3、 函数 InterlockedExchange()
4、关键代码:
是指这样一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权
所以我们可以通过如下结构体 CRITICAL_SECTION
举例如下:
5、使用关键代码时的技巧和注意点:
a、对每一个共享资源都使用一个CRITICAL_SECTION变量。这样对变量1进行操作时,可以由另一个线程对变量2进行操作;
b、同时访问多个共享资源时,必须以同样的顺序调用EnterCriticalSection(&g_cs),否则有可能引起死锁;
c、不要长时间运行关键代码。长时间运行关键代码,就意味着其他线程一直处于等待阶段。
【文尾】希望时间快点儿跑~~ 如果文章对您有帮助,请留下对我和蟹儿的祝福,谢谢~~
用户方式中线程的同步
1、 当系统中的线程对同一共享资源进行读取时,就会涉及线程的同步,也就是线程间的相互通信。
2、 原子访问:互锁
为了保证同一时间内只有一个线程在访问共享资源,我们一般会建立互锁函数。如函数
LONG InterlockedExchangeAdd(PLONG plTarget,LONG lVaule);就会以原子访问形式给传入的地址的值加或减相应的值。
3、 函数 InterlockedExchange()
//共享资源是否在被访问 BOOL g_fResourceInUse = FALSE; void Func1() { //将变量值为TRUE,并看看之前值是什么,如果是TRUE,那么就等待,否则可以访问 while (TRUE == InterlockedExchange(&g_fResourceInUse,TRUE)) { Sleep(0); } /************************************************************************/ /*可以对共享资源进行访问了 */ /************************************************************************/ //用完了将共享资源再置为FALSE InterlockedExchange(&g_fResourceInUse,FALSE); }
4、关键代码:
是指这样一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权
所以我们可以通过如下结构体 CRITICAL_SECTION
举例如下:
const int MAX_TIMES = 1000; int g_nIndex = 0; DWORD g_dwTimes[MAX_TIMES]; CRITICAL_SECTION g_cs; //初始化CRITICAL_SECTION,且循环等待不超过400次 InitializeCriticalSectionAndSpinCount(&g_cs,400); DWORD WINAPI FirstThread(PVOID pvParam) { while (g_dwTimes < MAX_TIMES) { EnterCriticalSection(&g_cs); g_dwTimes[g_nIndex] = GetTickCount(); g_nIndex++; LeaveCriticalSection(&g_cs); } } DeleteCriticalSection(g_cs);
5、使用关键代码时的技巧和注意点:
a、对每一个共享资源都使用一个CRITICAL_SECTION变量。这样对变量1进行操作时,可以由另一个线程对变量2进行操作;
b、同时访问多个共享资源时,必须以同样的顺序调用EnterCriticalSection(&g_cs),否则有可能引起死锁;
c、不要长时间运行关键代码。长时间运行关键代码,就意味着其他线程一直处于等待阶段。
【文尾】希望时间快点儿跑~~ 如果文章对您有帮助,请留下对我和蟹儿的祝福,谢谢~~
相关文章推荐
- Windows核心编程<读书笔记九>线程与内核对象的同步
- Windows核心编程<读书笔记六> 线程
- Windows核心编程<读书笔记七>线程的调度、优先级以及亲缘性 【含有代码】
- Windows核心编程<读书笔记十六>线程的堆栈
- Windows核心编程<读书笔记四之程序>显示系统中进程、线程、模块详细信息
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- Windows核心编程<读书笔记二>Unicode和ANSI
- Windows核心编程<读书笔记九>手把手写Queue程序
- Windows核心编程<读书笔记五>手把手写JobLab程序
- Windows核心编程<读书笔记四> 进程的概念
- Windows核心编程<读书笔记十二>纤程
- Windows核心编程<读书笔记十三>Windows的内存结构
- Windows核心编程<读书笔记四>return exit(0) ExitProcess的不同之处
- Windows核心编程<读书笔记五>作业JOB
- Windows核心编程<读书笔记十七> 内存映射文件
- windows核心编程<读书笔记一>---重写Onchar函数
- Windows核心编程<读书笔记十七>Applnst程序详解
- <<高质量c++c编程指南>>读书笔记2
- Java学习之路0804<复习>(线程、注解)
- 第六章 <Windows核心编程> 线程基本概念