以关键代码段为例子详细讲解多线程中的同步技术

简介:     说线程就要说到进程每一个exe文件运行的时候 系统就会为这个进程分配虚拟空间  ,多个进程在逻辑上重复使用该空间  。     线程实际上是程序真正的功能实现者,一个进程包含多个线程 ,线程之间相互协作共同完成一项任务 。

    说线程就要说到进程每一个exe文件运行的时候 系统就会为这个进程分配虚拟空间  ,多个进程在逻辑上重复使用该空间  。

    线程实际上是程序真正的功能实现者,一个进程包含多个线程 ,线程之间相互协作共同完成一项任务 。

    每个进程中的多个线程可以共享进程中的数据 。 每个进程都有一个唯一称为主线程的线程 ,例如 mian()函数所在的线程就是主线程  。

    有些CPU只支持单线程技术 但是我们仍然可以使用多线程是因为 操作系统给每个线程分配了 一个时间片 这个时间片很短 因此在一个线程的时间片到期的时候

另一个线程立马执行 ,就让我们感觉到好像实现了多线程 。。。。。

  

    什么是线程同步呢? 如何利用临界资源实现线程同步?

           既然是多个线程并发执行那么为什么我们须要线程的同步呢,下面我做一个比方 。  如果我们去买衣服 我们在换衣间换衣服的时候别人是不能进来换的 。

         必须要等 到我们换完衣服之后下一个人才可以进来  。相对于进程也是一个 一个进程中的多个线程 在执行着不同的功能 , 

        例如:进程中有  线程 A    B     ,    A对一个数据进行读取  ,B对同一个数据进行存储 当然会觉得这样效率很高 ,但是一旦AB 线程 同时对  这个数据进行 

        读取  和存取的时候 就会因为  A B 线程同时要求同一个资源 , 而导致线程的死锁  ,这就是 操作系统上常说的线程的死锁 。。     

         如果死锁发生name对于我们的软件是致命的打击  。    

        我们可以利用一个叫做关键代码段的技术来解决这个问题  当然实现线程同步的方法有很多 我这里只讲述 利用关键代码段实现线程的同步 !

       这种方法的实现思路如下 :

          例如有   A   B   2个线程     比如我们都要操作同一个数据  那么我们可以让这2个数据在操作之前 先来申请 一个叫做临界区的资源 ,这个资源是唯一的谁申请到

      谁就有对数据的操作权可以继续执行线程   另一个线程就必须暂停等待  知道 申请到临界资源的线程  释放了临界资源之后才可以 获得临界资源从而进行 数据的操作

     现在明白了吧  。。。其实很简单 ,如果还不明白不要紧看下代码就  OK了

 

   1.声明一个   CRITICAL_SECTION s ;   //临界资源

   2.初始化临界资源   ::InitializeCriticalSection(&s) ; //初始化临界区资源  

   3.

    EnterCriticalSection(&section);//进入关键代码段,取得临界区对象所有权
         数据的执行代码放在这里.........
    LeaveCriticalSection(&section);//释放临界区对象所有权 

4.在退出的时候 DeleteCriticalSection(&s)  ;//释放初始化了的临界资源    

 

以上就是 利用临界区实现线程同步的方法  代码如下

#include "windows.h"
#include <iostream>
using namespace std ;
int x=0 ;
CRITICAL_SECTION s ;  //定义一个临界区资源 在使用完毕的时候应该删除 掉

DWORD WINAPI Thread1(
  LPVOID lpParameter   // thread data
)
{  

 while(1)
 {
 ::EnterCriticalSection(&s);
 if(x<=100)
 {
     cout<<"Thread1: "<<x++<<endl ;
 ::LeaveCriticalSection(&s);
 }
 else
 {
  LeaveCriticalSection(&s);
  break;
 }
 }

return  0 ;
}
DWORD WINAPI Thread2(
  LPVOID lpParameter   // thread data
)
{
  while(1)
  {
  ::EnterCriticalSection(&s);
  if(x<=100)
  {
  cout<<"Thread2: "<<x++<<endl ;
  ::LeaveCriticalSection(&s);
  }
  else
  {
   LeaveCriticalSection(&s);
   break;
  }
  }
 return  0 ;
}
void main()
{
 
  ::InitializeCriticalSection(&s) ; //初始化临界区资源
  HANDLE h1,h2 ;
  h1=::CreateThread(NULL,0,Thread1,0,0,NULL) ;
  h2=::CreateThread(NULL,0,Thread2,0,0,NULL) ;
 // ::DeleteCriticalSection(&s);  //从内存中删除掉初始化好的临界区
  Sleep(5000); ;
}

 

 

 

 

       

 \

         

目录
相关文章
|
2月前
|
Java 云计算
Java多线程编程中的同步与互斥机制探析
在当今软件开发领域,多线程编程是一项至关重要的技能。本文将深入探讨Java中的同步与互斥机制,分析其在多线程环境下的应用及实现原理,帮助读者更好地理解并运用这一关键技术。
24 4
|
2月前
|
Python
在Python中,如何保证多个线程之间的同步?
在Python中,如何保证多个线程之间的同步?
24 4
|
2月前
|
安全 Python
Python中的并发编程:多线程与多进程技术探究
本文将深入探讨Python中的并发编程技术,重点介绍多线程和多进程两种并发处理方式的原理、应用场景及优缺点,并结合实例分析如何在Python中实现并发编程,以提高程序的性能和效率。
|
2月前
|
NoSQL 数据处理 调度
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
【Redis深度专题】「踩坑技术提升」探索Redis 6.0为何必须启用多线程以提升性能与效率
245 0
|
2天前
|
存储 缓存 前端开发
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类
12 3
|
4天前
|
Dart 前端开发 安全
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
【4月更文挑战第30天】本文探讨了Flutter中线程管理和并发编程的关键性,强调其对应用性能和用户体验的影响。Dart语言提供了`async`、`await`、`Stream`和`Future`等原生异步支持。Flutter采用事件驱动的单线程模型,通过`Isolate`实现线程隔离。实践中,可利用`async/await`、`StreamBuilder`和`Isolate`处理异步任务,同时注意线程安全和性能调优。参考文献包括Dart异步编程、Flutter线程模型和DevTools文档。
【Flutter前端技术开发专栏】Flutter中的线程与并发编程实践
|
10天前
|
缓存 Java 编译器
第一章 Java线程池技术应用
第一章 Java线程池技术应用
13 0
|
10天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
10天前
|
监控 安全 Java
一文讲明白Java中线程与进程、并发与并行、同步与异步
一文讲明白Java中线程与进程、并发与并行、同步与异步
7 1
|
11天前
|
并行计算 算法 Java
Java中的多线程技术实现与应用
【4月更文挑战第23天】本文将深入探讨Java中的多线程技术,包括其基本概念、实现方法以及在实际应用中的优势。我们将通过实例代码和应用场景,详细解析多线程技术在Java中的应用,以期帮助读者更好地理解和掌握这一技术。

相关实验场景

更多