线程同步与锁

二元信号量,多元信号量,互斥量,临界区。其它包括读写锁,条件变量。

-1:二元信号量,适合与只能被一个线程独占访问的资源。当二元信号量处于非占用状态时,第一个试图获取该二元信号量的线程会获得该锁,并将二元信号量重置为占用状态,在未释放该锁前,其它所有试图获取该二元信号量的线程将会等待。

-2:多元信号量,简称信号量。一个初始值为N的信号量允许N个线程并发访问。

获取该信号量时,信号量的值减一,当信号量的值小于0时,再来获取信号量的线程进入等待状态。

释放该信号量时,信号量的值加一,当信号量的值大于0时,唤醒一个处于等待中的线程。

-3:互斥量,与二元信号量类似,资源同时仅允许一个线程访问,但不同之处的是,信号量在整个系统内可以被任意线程获取,释放。即信号量可以被线程A获取,再由线程B释放。而互斥量要求那个线程获取,哪个线程就要负责释放这个锁,其它线程去释放是无效的。

-4:临界区,比互斥量更加严格的同步手段。临界区与信号量,互斥量不同之处在于,信号量和互斥量在系统的任何进程中都是可见的,一个进程创建了互斥量,其它进程来获取该锁是合法的。临界区的作用范围仅限于本进程。除此之外,互斥量和临界区具有相同的性质。

使用互斥量不仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。

线程同步与锁

时间: 2024-08-03 15:28:59

线程同步与锁的相关文章

python笔记10-多线程之线程同步(锁lock)

前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸.为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸熟了再开吃,那么python如何模拟这种场景呢? 未锁定 1.如果多个线程同时操作某个数据,会出现不可预料的结果.比如以下场景:当小伙伴a在往火锅里面添加鱼丸的时候,小伙伴b在同时吃掉鱼丸,这很有可能导致刚下锅的鱼丸被夹出来了(没有熟),或者还没下锅,就去夹鱼丸(夹不到). # coding=utf-

Linux线程同步---互斥锁

线程中互斥锁使用的步骤与信号量相似! 1.首先定义互斥锁变量,并初始化 pthread_mutex_t mutex_lock;pthread_mutex_init(&mutex_lock,NULL);2.在操作前对互斥量进行加锁操作 pthread_mutex_lock(&mutex_lock);3.操作完毕后进行解锁操作 pthread_mutex_unlock(&mutex_lock); 所有操作均在加锁和解锁操作之间进行,保证同时仅仅对有一个操作对关键变量或是区域进行操作.

线程同步--悲观锁

在做数据库访问的时候,遇到了这样的问题:两个线程同时访问同一对象中的方法,那么就可能会引发数据不一致的问题,那么我们需要做的,就是加上锁. 第一种方案:Synchronized Java中用来给对象和方法或者代码加锁的,当他锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行该代码.当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只有一个线程得到,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 用法:Synchronized 加入方法上和S

iOS线程同步和锁

应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题.两个线程同时修改同一资源有可能以意想不到的方式互相干扰. iOS 提供了你可以使用的多个同步工具,从提供互斥访问你程序的有序的事件的工具等.以下个部分介绍了这些工具和如何在代码中使用他们来影响安全的访问程序的资源. 我们通过同一个例子来说明这些锁,当两个线程同时操作一个可变数组时,一个线程添加数据,一个线程删除数据,类似一个生产消费者模式,就会存在线程安全问题: 使用POSIX互斥锁 __block pthread_mutex_

Linux 线程编程2.0——线程同步-互斥锁

当我们需要控制对共享资源的存取的时候,可以用一种简单的加锁的方法来控制.我们可以创建一个读/写程序,它们共用一个共享缓冲区,使用互斥锁来控制对缓冲区的存取. 函数 pthread_mutex_init()用来生成一个互斥锁.其函数原型如下: #include<pthread.h> int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr): 第一个参数是互斥变量

iOS 线程同步 自旋锁 OSSpinLock

#import "ViewController.h" #import <libkern/OSAtomic.h> @interface ViewController () @property (nonatomic,assign) int ticket; //@property (nonatomic,assign) OSSpinLock lock; @end @implementation ViewController - (void)viewDidLoad { [super

Linux线程同步

线程同步-互斥锁 1.初始化互斥锁pthread_mutex_init() int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 例: pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL); 2.锁住互斥锁pthread_mutex_lock() int pthread_mutex_lock(pt

9 C++ Boost 多线程,线程同步

线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程 线程中断 线程中断2, 线程组 boost 线程的死锁 boost 线程递归锁 线程互斥锁,线程同步 unique_lock 锁,离开作用域自动释放 unique_lock 锁 示例 2,可以显式的释放锁 boost 1次初始化 boost 条件变量 boost 线程锁,一个账户往另外一个账户转钱案例 boost upgrade_lock 知识背景

【java并发】(2) Java线程同步:synchronized锁住的是代码还是对象

在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行.synchronized既可以加在一段代码上,也可以加在方法上. 关键是,不要认为给方法或者代码段加上synchronized就万事大吉,看下面一段代码: class Sync { public synchronized void test() { System.out.println("test开始.."); try { Thread.sle