首页 > 其他分享 >自旋锁与互斥锁的区别

自旋锁与互斥锁的区别

时间:2024-05-29 09:11:17浏览次数:13  
标签:区别 sl 互斥 线程 func 自旋 SpinLock

编程世界中,锁用来保护一个资源不会因为并发操作而引起冲突,导致数据不准确。

常见的锁有互斥锁、读写锁、自旋锁、信号量、分布式锁等等。

这里仅仅讨论互斥锁和自旋锁的区别。

自旋锁是当资源被占用时,锁逻辑循环判断资源是否可用,而不是把进程挂起,直到资源可用。
自旋锁采用的是,循环等待资源可用,而不是挂起当前线程或者进程,因为在某些场景中,CPU挂起线程或者进程的开销更大。
因此,自旋锁适用于对共享资源占用时间比较小的场景中。

与自旋锁不同的互斥锁,在加锁失败后,如果资源不可用,当前锁所在线程会阻塞释放CPU ,给其他线程使用。

自旋锁和互斥锁均属于悲观锁.

附Golang中 自旋锁的实现:

//SpinLock.go

package main

import (
	"fmt"
	"sync/atomic"
	"time"
)

type Locker interface {
	Lock()
	Unlock()
}

type SpinLock int32

func (sl *SpinLock) Lock() {
	for !atomic.CompareAndSwapInt32((*int32)(sl), 0, 1) {
		// fmt.Printf("locked")
	}
}

func (sl *SpinLock) Unlock() {
	atomic.StoreInt32((*int32)(sl), 0)
}

func main() {
	l := new(SpinLock)

	v := 0
	for i := 0; i < 2; i++ {
		go func(t int) {
			for v < 1000 {
				l.Lock()
				v++
				l.Unlock()
				fmt.Printf("t%d: %d\n", t, v)
				time.Sleep(1 * time.Millisecond)
			}
		}(i)
	}

	for v < 1000 {
		<-time.After(100 * time.Millisecond)
	}
}

标签:区别,sl,互斥,线程,func,自旋,SpinLock
From: https://www.cnblogs.com/zongzw/p/18219480

相关文章

  • Servlet中/和/*的区别详解
    Servlet中/和/*的区别详解问题在搭建springmvc项目时,DispatcherServlet配置为/*时welcome-file-list失效了报404异常,配置为/时可以正常访问,下面记录问题排查过程所涉及关于servlet的知识<!--welcome-file-list配置--><welcome-file-list><welcome-fil......
  • strcpy和memcpy的区别
    系统编程strcpy和memcpy的区别strcpy与memcpy都是标准C库函数①char*strcpy(char*dest,constchar*src);strcpy:字符串的复制and也会复制字符串的结束符。不需要指定长度,它遇到被复制字符的串结束符"\0"即结束,容易溢出。②voidmemcpy(void**dest,constvoid**sr......
  • 大端和小端的区别
    大端(BigEndian)和小端(LittleEndian)的区别主要体现在字节序的排列上,特别是在多字节数据的存储和传输过程中。以下是两者的详细区别:一、定义与背景大端(BigEndian):指最高有效位(MSB)存储在低位内存地址,而最低有效位(LSB)存储在高位内存地址的方式。这种方式也被称为网络字节序。小......
  • 3个进程实现共享内存、信号量、互斥访问
    V1.02024年5月28日发布于博客园题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互......
  • css中px和em的区别
    px和em是用来表示元素大小的单位,在CSS中经常被使用。px(pixel)是像素单位,表示屏幕上的一个点。它是一个绝对单位,表示一个固定的大小。例如,一个宽度为200px的元素将始终显示为200个像素宽。em是相对单位,根据继承它的父元素的字体大小来计算实际的大小。默认情况下......
  • sleep() 和 wait() 有什么区别?
    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或noti......
  • 系统编程练习题---利用共享内存和信号量集,完成两个进程之间的互斥通信
    目录题目解析代码展示process_A.cprocess_B.cprocess_C.c结果展示重要知识点记录题目设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程......
  • A申请共享内存并对信号量进行初始化,然后进程B与C实现互斥
    练习:设计一个程序,作为进程A,进程A专门创建一个信号量集,要求信号量集中有1个信号量,对信号量集合中的信号量进行设置,要求集合中的信号量的初值为1,然后再设计2个程序,分别是进程B和进程C,要求进程B和进程C使用进程A创建的信号量集合中的信号量实现互斥访问。提示:进程A、进程B、进......
  • Overload和Override的区别。Overloaded的方法是否可以改变返回值类型?
    Overload是重载的意思,Override是覆盖的意思,也就是重写。重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法......
  • 利用信息量集实现互斥访问
    进程A用来生成信号集,并将其初值设为1(运行顺序为进程A->B->C)/**@Author:[email protected]*@Date:2024-05-0817:20:41*@LastEditors:[email protected]*@LastEditTime:2024-05-2818:47:38*/#include<stdio.h>#include<stdlib.h>#include<sys/......