线程同步——用户模式下线程同步——关键段实现线程同步

 1  //2.使用关键段实现线程同步
 2  使用时必须有以下几个步骤
 3  //(1)必须先定义 CRITICAL_SECTION 结构
 4  CRITICAL_SECTION  g_cs;
 5  //(2)初始化关键段 CRITICAL_SECTION
 6  InitializeCriticalSection(&g_cs);
 7  //(3)在线程中调用
 8  DWORD WINAPI ThreadFunOne(PVOID pvParam)
 9  {
10      EnterCriticalSection(&g_cs)  ;
11
12      //共享的资源应该放在EnterCriticalSection和EnterCriticalSection函数之间
13
14      EnterCriticalSection(&g_cs);
15      return 0;
16  }
17  //(4)清理CRITICAL_SECTION结构,必须确保已经没有资源使用此关键段,否则会出现不可预料的结果
18  DeleteCriticalSection(&g_cs);
19 //关于
20 VOID EnterCriticalSection( LPCRITICAL_SECTION lpCriticalSection ) ;
21 1)如果没有线程正在访问资源,那么EnterCriticalSection立刻更新成员变量,以表示调用线程
22     已经获准的对资源的访问,并立即返回,这样线程可以继续执行代码(访问资源)。
23     2)如果成员变量表示调用线程已经获准访问资源,那么EnterCriticalSection更新变量,以表示调用线程被准获访问次数,
24     并立即返回。这种情况很少,只有当线程调用LeaveCriticalSection 之前连续调用EnterCriticalSection两次及以上才会发生。
25     3)如果成员变量表示有一个(调用线程之外的其他)线程已经获准访问资源,那么EnterCriticalSection会使用
26     一组内核对象,把线程切换为等待状态,等待不会浪费CPU时间,这就完美了。
27     一句话概括就是:调用 EnterCriticalSection 一个线处理资源,其他线程变为等待。
28
29     VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection )
30     系统会自动更新 CRITICAL_SECTION 的成员变量并将等待的线程,切换为可调度状态。
31
32
33     VOID TryEnterCriticalSection(  LPCRITICAL_SECTION lpCriticalSection ) ;
34 此函数可以代替 EnterCriticalSection 函数,但是:
35     此函数从来不会让调用线程等待。它可以通过返回值查看,调用线程是否获准访问资源,
36     如果其它线程正在访问资源,则返回 FALSE ,否则,返回 TRUE 。
37
38
39 #include "windows.h"
40 #include "iostream"
41 using namespace std;
42 long g_x = 0 ;
43 //(1)必须先定义 CRITICAL_SECTION 结构
44 CRITICAL_SECTION  g_cs;
45
46 //定义线程函数1
47 DWORD WINAPI ThreadFunOne(PVOID pvParam) ;
48
49 //定义线程函数2
50 DWORD WINAPI ThreadFunTwo(PVOID pvParam);
51
52 int main()
53 {
54
55     //(2)初始化关键段 CRITICAL_SECTION
56     InitializeCriticalSection(&g_cs);
57
58     //创建线程1
59     HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
60     CloseHandle(hThreadOne);
61
62     //创建线程2
63     HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
64     CloseHandle(hThreadTwo);
65
66     //让主线程先挂起,确保其它线程执行完成
67     Sleep(1000);
68     cout<<g_x<<endl;
69
70     //(4)清理CRITICAL_SECTION结构,必须确保已经没有资源使用此关键段,否则会出现不可预料的结果
71     DeleteCriticalSection(&g_cs);
72     return 0 ;
73 }
74
75 DWORD WINAPI ThreadFunOne(PVOID pvParam)
76 {
77     EnterCriticalSection(&g_cs)  ;
78
79     //共享的资源应该放在EnterCriticalSection和EnterCriticalSection函数之间
80     g_x++;
81
82     EnterCriticalSection(&g_cs);
83     return 0;
84 }
85
86 DWORD WINAPI ThreadFunTwo(PVOID pvParam)
87 {
88     EnterCriticalSection(&g_cs)  ;
89
90     //共享的资源应该放在EnterCriticalSection和EnterCriticalSection函数之间
91     g_x++;
92
93     LeaveCriticalSection(&g_cs);
94     return 0;
95 }
96  

线程同步——用户模式下线程同步——关键段实现线程同步

时间: 2024-10-27 04:10:59

线程同步——用户模式下线程同步——关键段实现线程同步的相关文章

线程同步——用户模式下线程同步——Slim读写锁实现线程同步

1 //Slim读/写锁实现线程同步 2 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 3 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 4 和哪些想要更新资源值的线程(写入者线程).让所有读取者资源在同一时刻访问共享资源应该是 5 可行的,这是因为仅仅读取资源并不存在破坏数据的风险.只有当写入者线程想要对资源进行更新时才需要同步. 6 这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问

线程同步——用户模式下线程同步——Interlocked实现线程同步

1 线程同步分为用户模式下的线程同步和内核对象的线程同步. 2 3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 4 5 6 7 8 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 9 10 //(1)首先是InterlockedExchangeAdd兄弟函数, 11 //第一个参数 Addend 代表进行操作数的地址, 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 13

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

8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同步机制.其目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立为止.如读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据.同理,当写者把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空. (2)等待函数:SleepConditionVariab

CentOS单用户模式下修改ROOT密码和grub加密

Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时,就需要进入单用户模式或修复模式对系统进行管理了. 使用单用户模式有一个前提,就是您的系统引导器(grub)能正常工作,否则要进行系统维护就要使用修复模式. 特注:进入单用户模式,没有开启网络服务,不支持远程连接 Linux 系统中不同的运行级别(Run Level)代表了系统的不同运行状态,例如

单用户模式下mount -o remount,rw / 有大用途

我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命令:mount –o remount,rw / 这个命令来让我们的/路径文件系统为可读模式,这样就可以实现自由修改了. 例如: 增加了/etc/mtab /dev/sdb1 /install ext3 rw 0 0 /etc/fstab LABEL=/install /install ext3 de

单用户模式下必用mount -o remount,rw /

我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,/文件系统是只读模式,任何用户都无法进行修改,那么这个时候我们就需要用到一条命令:mount -o remount,rw / 这个命令来让我们的/文件系统为可读可写模式,这样就可以实现自由修改了.

RHEL&CentOS 6.x 单用户模式下增添密码保护

操作环境: 最小化安装的32位CentOS 6.4 1.备份 #cp /etc/sysconfig/init /etc/sysconfig/init.backup 2.添加密码保护命令 #sed -i 's/SINGLE=\/sbin\/sushell/SINGLE=\/sbin\/sulogin/' /etc/sysconfig/init RHEL&CentOS 6.x 单用户模式下增添密码保护

Windows核心编程笔记(6)----用户模式下的线程同步

1.原子锁 使用InterlockedExchangeAdd函数来实现原子增长,InterlockedExchange\InterlockedExchangePointer用来交换两个变 量的值,InterlockedCompareExchange对比数值,相等则交换(对应的InterlockedCompareExchangePointer).对应的 还有64位函数. InterlockedIncrement\InterlockedDecrement是比较老的函数,只能增加或递减1,Interl

第8章 用户模式下的线程同步

8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问该资源. ②从汇编的角度看,哪怕很简单的一条高级语言都可以被编译成多条的机器指令.在多线程环境下,这条语句的执行就可能被打断.而在打断期间,其中间结果可能己经被其他线程更改过,从而导致错误的结果. ③在Intelx86指令体系中,有些运算指令加上lock前缀就可以保证该指令操作的原子性.其原理是CPU执行该指