当前位置: 首页 > news >正文

线程同步机制

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

同步就是协同步调,按预定的先后次序进行运行。“同”字应是指协同、协助、互相配合,而不是所谓的同时。

如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。

所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回,同时其它线程也不能调用这个方法。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。例如Window API函数SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的LRESULT值返回给调用者。

在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。

通过synchronized(java)或者 @synchronized{} 、NSLock(ios)进行同步的保证

class MyTest {

    private static final Object lock = new Object();

 

    public static synchronized void test() {

        // 同步的方法

    }

 

    public void test2() {

        synchronized(lock) {

            // 方法级同步,也可以使用this实现对象级同步

        }

    }

 

}

在C++里面,通过std::mutex的加锁和解锁来保证。例如:#include <mutex>

#include <thread>

 

using namespace std;

 

mutex m;

 

void threadFunc(int i)

{

    m.lock();

    // 在这里写上你需要的代码

    m.unlock();

}

 

int main()

{

    thread t1(threadFunc, 1);

    thread t2(threadFunc, 2);

    t1.join();

    t2.join();

    return 0;

}

1线程同步的方式和机制

临界区、互斥区、事件、信号量四种方式

临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别

1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

2、互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享

3、信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目

4、事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作


转载于:https://my.oschina.net/starmier/blog/199877

相关文章:

  • PHP泛域名应用
  • keytool 用法总结
  • MediaPlayer视频播放
  • Android文本框实现搜索和清空效果
  • strongweak
  • powershell最常用的命令之(一)
  • 左固定右边自适应框架
  • logrotate工具的使用
  • ping,
  • php操作mysql数据库类代码
  • 恶补英语-1
  • 随机选择实现
  • 重读金典------高质量C编程指南(林锐)-------第六章 函数设计
  • Oracle 修改表列属性
  • CKEditor如何统计文字数量
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 2017前端实习生面试总结
  • bearychat的java client
  • CentOS6 编译安装 redis-3.2.3
  • Computed property XXX was assigned to but it has no setter
  • javascript 哈希表
  • Java教程_软件开发基础
  • Js基础知识(四) - js运行原理与机制
  • session共享问题解决方案
  • spring + angular 实现导出excel
  • text-decoration与color属性
  • 简单实现一个textarea自适应高度
  • 理解在java “”i=i++;”所发生的事情
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 深入浅出Node.js
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过npm或yarn自动生成vue组件
  • 小程序button引导用户授权
  • ​configparser --- 配置文件解析器​
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (转)mysql使用Navicat 导出和导入数据库
  • .cfg\.dat\.mak(持续补充)
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Standard 的管理策略
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [autojs]autojs开关按钮的简单使用
  • [C++打怪升级]--学习总目录
  • [C++随笔录] 红黑树
  • [FT]chatglm2微调
  • [Hive] 常见函数
  • [HTML]Web前端开发技术30(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [KMP求最小循环节][HDU1358][Period]
  • [MYSQL数据库]- 索引
  • [RK-Linux] Linux A/B System详解
  • [uni-app] uni.showToast 一闪而过问题/设定时间无效/1秒即逝
  • [zabbix] zabbix监控其他