windows版本的线程锁

简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。而此时,并没有任何资源被“锁定”。不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的)。只不过,在这个线程尚未执行LeaveCriticalSection之前,其它线程碰到EnterCritialSection语句的话,就会处于等待状态,相当于线程被挂起了。 这种情况下,就起到了保护共享资源的作用。 
      也正由于CRITICAL_SECTION是这样发挥作用的,所以,必须把每一个线程中访问共享资源的语句都放在EnterCritialSection和LeaveCriticalSection之间。这是初学者很容易忽略的地方。

#include <windows.h>

class CTLock
{
public:
  CTLock();
  ~CTLock();

  CRITICAL_SECTION m_cs; //  临界区

  inline void Lock()
  {
      EnterCriticalSection(&m_cs);
  }

  inline void Unlock()
  {
     LeaveCriticalSection(&m_cs);
  }

};

CTLock::CTLock()
{
  InitializeCriticalSection(&m_cs);
}

CTLock::~CTLock()
{
  DeleteCriticalSection(&m_cs);
}
时间: 2024-10-09 15:40:57

windows版本的线程锁的相关文章

13 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件  queue队列 生产者消费者模型 Queue队列 开发一个线程池

本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queue队列 开发一个线程池 进程 语法 进程间通讯 进程池 操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把

一个简单的线程锁------pthread和win32的临界区(Critical Section)

临界区: 临界区是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权.这是让若干代码能够"以原子操作方式"来使用资源的一种方法. 所谓原子(atomic)操作方式,是指这段代码知道没有别的线程要访问这个资源. 说明: 1.  MacOSX,Windows有自己的线程模型, pthread可以说是跨平台的线程编程模型解决方案,当然对pthread不熟悉的也可以使用本地线程模型, 其实pthread的win32版本也是基于本地线程模型的, pthread-win32的mutex

线程锁(互斥锁Mutex)

线程锁(互斥锁Mutex) 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据,会出现什么状况? # -*- coding:utf-8 -*- import threading import time num = 100#设定一个共享变量:num=100在主线程中,我想要在子线程中修改num def run(n): global num#在函数里修改函数外变量,首先应该声明为全局变量,在每个线程中都获取这个全局变

Python网络编程(进程通信、信号、线程锁、多线程)

什么是进程通讯的信号? 用过Windows的我们都知道,当我们无法正常结束一个程序时, 可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢? 同样的功能在Linux上是通过生成信号和捕获信号来实现的, 运行中的进程捕获到这个信号然后作出一定的操作并最终被终止. 信号是UNIX和Linux系统响应某些条件而产生的一个事件, 接收到该信号的进程会相应地采取一些行动.通常信号是由一个错误产生的. 但它们还可以作为进程间通信或修改行为的一种方式, 明确地由一个进程发送给另一个进程.一个信号的产生叫

windows版本nginx帮助文档

本文是nginx官方文档的直译.引文链接原文链接 nginx的windows版本使用原生的win32API.当前只使用了select()连接处理方法,因此不应认为它有高性能和具有可伸缩性.由于众所周知的原因,windows版本的nginx通常被认为是beta版本.但是,它几乎提供了unix版本一样的功能(xslt过滤器.图像过滤器等模块除外). 要安装windows版本的nginx,首先下载主干分支(下载地址)的发布版本,然后解压启动.本文 以下载目录为C盘根目录为例: cd c:\ unzip

002-多线程-锁-同步锁-synchronized几种加锁方式、Java对象头和Monitor、Mutex Lock、JDK1.6对synchronized锁的优化实现

一.synchronized概述基本使用 为确保共享变量不会出现并发问题,通常会对修改共享变量的代码块用synchronized加锁,确保同一时刻只有一个线程在修改共享变量,从而避免并发问题. synchronized结论: 1.java5.0之前,协调线程间对共享对象的访问的机制只有synchronized和volatile,但是内置锁在功能上存在一些局限性,jdk5增加了Lock以及ReentrantLock. 2.java5.0,增加了一种新的机制:显式锁ReentrantLock,注意它

001-多线程-锁-架构【同步锁、JUC锁】

一.概述 Java中的锁,可以分为"同步锁"和"JUC包中的锁". 1.1.同步锁 即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁.Java 1.0版本中就已经支持同步锁了. 同步锁的原理是,对于每一个对象,有且仅有一个同步锁:不同的线程能共同访问该同步锁.但是,在同一个时间点,该同步锁能且只能被一个线程获取到.这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行:而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才

day9---多线程,线程锁,队列

进程.线程http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述]Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势. 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threa

多线程篇八:线程锁

1.线程锁Lock/ReentrantLock package com.test.lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; //线程锁,通常用于替换synchronized,比synchronized更加面向对象 public class LockTest { static class Outputer{ Lock locks=new Reentra