多线程同步系列之二-----关键区

关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将

阻塞等待,知道该线程释放关键区的拥有权。

关键区同步主要有以下几个API

初始化关键区对象,无返回值,传入一个关键区对象的指针。

该函数在使用完关键区之后删除关键区对象,无返回值,同样传入一个关键区对象指针

该函数为进入关键区函数,传入的参数为关键区对象指针,无返回值。如果另外一个线程正拥有关键区的所有

权,那么该函数将阻塞,直到其他线程释放关键区的所有权之后,该函数才能继续执行进入关键区。

该函数与EnterCriticalSection正好相反,EnterCriticalSection是获取关键区所有权进入关键区,

而LeaveCriticalSection是释放关键区所有权,离开关键区。

我们下面还是继上一文多线程同步系列之一-----互斥对象中同步卖票的例子进行续写。

 1 #include <windows.h>
 2 #include <stdio.h>
 3
 4 static int number=10;
 5 CRITICAL_SECTION CriticalSection;
 6
 7 DWORD WINAPI ThreadOne(LPVOID lpParameter)
 8 {
 9     printf("窗口1售票开始:\n");
10     while(1)
11     {
12         EnterCriticalSection(&CriticalSection);
13         if(number>0)
14         {
15             printf("窗口1售出第%d张票...\n",number);
16             number--;
17             Sleep(1000);
18         }
19         LeaveCriticalSection(&CriticalSection);
20         Sleep(100);
21     }
22     return 0;
23 }
24 DWORD WINAPI ThreadTwo(LPVOID lpParameter)
25 {
26     printf("窗口2售票开始:\n");
27     while(1)
28     {
29         EnterCriticalSection(&CriticalSection);
30         if(number>0)
31         {
32             printf("窗口2售出第%d张票...\n",number);
33             Sleep(1000);
34             number--;
35         }
36         LeaveCriticalSection(&CriticalSection);
37         Sleep(100);
38     }
39     return 0;
40 }
41
42
43 int main()
44 {
45     HANDLE HOne,HTwo;
46     InitializeCriticalSection(&CriticalSection);
47     printf("***********************vpoet******************\n");
48     HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
49     HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
50     CloseHandle(HOne);
51     CloseHandle(HTwo);
52     while(TRUE)
53     {
54         if(number==0)
55         {
56             printf("不好意思,票卖完了!\n");
57             DeleteCriticalSection(&CriticalSection);
58             return 0;
59         }
60         else
61         {
62             continue;
63         }
64     }
65
66     return 0;
67 }

运行截图:

时间: 2024-10-10 04:24:14

多线程同步系列之二-----关键区的相关文章

Java多线程开发系列之二:如何创建多线程

前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等. 在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程. 在Java中创建多线程的方式有两种: (1)写一个子类,这个类要继承自Thread类,于此同时这个子类必须要重写Thread类中的run方法(原因我后文中会提到),然后我们就可以用这个类来创建出一个多线程. (2)仍然是写一个类,这个类要实现Runnable接口,与(1)相同,在这个实现类中也需要重写run方法. 这里有一点要注

C++多线程同步技巧(二)--- 事件

简介 Windows在线程同步方面提供了多种信号处理机制,其中一种便是使用 CreateEvent() 函数创建事件,然后使用信号控制同步.其中将事件变为有信号可使用 SetEvent() 函数,将事件信号复位(变为无信号)可使用 ResetEvent() 函数,信号可以配合 WaitForSingleObject() 函数进行控制,当有信号时,此函数便会放行:无信号时,此函数会将阻塞. 提示: CreateEvent() 函数的参数 bManualReset 的含义是信号是否由人工复位,如果选

Java的多线程机制系列:不得不提的volatile及指令重排序(happen-before)

一.不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它:我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它.比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰,见代码 /* Java thread status for tools, * initialized to indicate thread 'not yet started' */   p

windows多线程同步总结

1.多线程同步与多线程互斥的关系 其实这也是我一直困扰的问题,在这里我只是说说我的理解. 我的理解是多线程互斥是针对于多线程资源而言的. 而多线程同步是针对于多线程时序问题. 由于线程的并发性导致其运行时间的不确定性,所以我们需要 控制多个线程的协同工作. 还是举卖票的例子来区别互斥和同步的区别吧: 比如我们有两个窗口进行卖票,当然这里就需要一个全局变量 来计数当前卖了第几张票了,最重要的是一张票不能卖出去两次, 所以当窗口1在卖第N张票的时候,窗口2应该就不能卖第N张票, 否则当不进行互斥的时

【python标准库学习】thread,threading(二)多线程同步

继上一篇介绍了python的多线程和基本用法.也说到了python中多线程中的同步锁,这篇就来看看python中的多线程同步问题. 有时候很多个线程同时对一个资源进行修改,这个时候就容易发生错误,看看这个最简单的程序: import thread, time count = 0 def addCount(): global count for i in range(100000): count += 1 for i in range(10): thread.start_new_thread(ad

嵌入式 Linux进程间通信(十二)——多线程同步

嵌入式 Linux进程间通信(十二)--多线程同步 多线程编程中有三种线程同步机制:互斥锁.信号量.条件量.本文将使用生产者消费者问题编程实践三种线程同步方式. 生产者.消费者问题:生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费.消费者线程从缓冲区中获得物品,然后释放缓冲区.当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区.当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来. 一.互斥锁

转---秒杀多线程第十二篇 多线程同步内功心法——PV操作上

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> <秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量> <秒杀多线程第十篇生产者消费者问题> <秒杀多线程第十一篇读者写者问题>

秒杀多线程第十二篇 多线程同步内功心法——PV操作上

阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event> <秒杀多线程第七篇经典线程同步互斥量Mutex> <秒杀多线程第八篇经典线程同步信号量Semaphore> <秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量> <秒杀多线程第十篇生产者消费者问题> <秒杀多线程第十一篇读者写者问题>

java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)

本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: [java] view plain copy print? package com.zejian.test; /** * @author zejian * @time 2016年3月12日 下午2:55:42 * @decrition 模拟卖票线程 */ public class Ticket implements Runnable { //当前拥有的票数 private