iOS 锁总结(cc)

iOS中atomic和synchrosize锁的本质是什么?  

在iOS中,atomic@synchronized锁的本质涉及底层的多线程同步机制。以下是关于这两者本质的详细解释:

atomic

  1. 定义与用途

    • atomic是Objective-C属性修饰符的一种,用于指示属性的存取方法是线程安全的。
    • 当一个属性被声明为atomic时,编译器会生成线程安全的存取方法,以确保在多线程环境下该属性的访问不会导致数据竞争。
  2. 实现机制

    • 在Objective-C的运行时实现中(例如在objc4的实现里),atomic是通过自旋锁(spinlock_t)来实现的。
    • 当一个线程尝试获取或设置atomic属性时,它会先获取自旋锁,执行操作后释放锁。这确保了同一时间只有一个线程能够访问该属性。
  3. 性能与限制

    • 虽然atomic能提供线程安全性,但它并不保证复合操作的原子性。例如,先检查后执行(check-then-act)的操作仍然可能不安全。
    • atomic属性的存取操作相对于nonatomic会有更高的性能开销,因为涉及到锁的获取和释放。

@synchronized

  1. 定义与用途

    • @synchronized是Objective-C中的一个指令,用于创建一个互斥锁(mutex)来保护特定代码段的执行,防止多个线程同时执行该段代码。
    • 它用于确保一段代码在同一时间只能被一个线程执行,从而避免数据竞争和条件竞争。
  2. 实现机制

    • @synchronized指令内部使用了一个互斥锁(mutex)来实现同步。
    • 当线程进入@synchronized代码块时,会尝试获取锁。如果锁已经被其他线程持有,则当前线程会阻塞,直到锁被释放。
    • 一旦线程获取了锁,它就可以安全地执行@synchronized代码块中的代码。执行完毕后,锁会被自动释放。
  3. 性能与限制

    • 使用@synchronized可以确保线程安全,但也会引入一定的性能开销,特别是在高并发场景下。
    • atomic不同,@synchronized可以用于保护更复杂的操作或代码段,而不仅仅是单个属性的存取。

总的来说,atomic@synchronized在iOS中都是用于实现线程同步的机制,但它们的用途和实现方式有所不同。atomic主要用于保护属性的线程安全存取,而@synchronized则用于保护更广泛的代码段免受并发访问的影响。

扩展:

iOS中atomic属性的作用是什么?

synchronized锁的使用场景有哪些?

atomic和synchronized有何不同?

自旋锁  

iOS中自己怎么实现一个自旋锁?

  

在iOS中,你可以使用OSSpinLock来实现自旋锁,但需要注意的是,从iOS 10和macOS 10.12开始,Apple已经弃用了OSSpinLock,因为它可能在高并发情况下导致优先级反转和其他问题。尽管如此,为了解释概念,我会首先展示一个基于OSSpinLock的简单示例,然后提供一个使用pthread_spinlock_t的替代方案。

使用OSSpinLock(已弃用,不推荐使用)

 

Objective-C

复制代码

1

#import <libkern/OSSpinLock.h>

2

3

OSSpinLock lock = OS_SPINLOCK_INIT;

4

5

void criticalSection() {

6

OSSpinLockLock(&lock);

7

// 临界区代码

8

OSSpinLockUnlock(&lock);

9

}

使用pthread_spinlock_t(推荐方法)

 

Objective-C

复制代码

1

#include <pthread.h>

2

3

pthread_spinlock_t spinlock;

4

5

// 初始化自旋锁

6

pthread_spin_init(&spinlock, PTHREAD_PROCESS_PRIVATE);

7

8

void criticalSection() {

9

pthread_spin_lock(&spinlock);

10

// 临界区代码

11

pthread_spin_unlock(&spinlock);

12

}

13

14

// 在不再需要锁时销毁它

15

pthread_spin_destroy(&spinlock);

在这个例子中,pthread_spinlock_t是POSIX线程库提供的自旋锁类型。使用pthread_spin_init函数初始化锁,并设置其为PTHREAD_PROCESS_PRIVATE,这意味着锁只能在同一进程的线程之间共享。在临界区前后分别调用pthread_spin_lockpthread_spin_unlock函数来加锁和解锁。最后,当锁不再需要时,应调用pthread_spin_destroy来销毁锁。

使用std::atomic_flag实现自旋锁(C++11及更高版本)

如果你在使用C++,并且你的编译器支持C++11或更高版本,你还可以使用std::atomic_flag来实现一个简单的自旋锁:

 

C++

复制代码

1

#include <atomic>

2

#include <thread>

3

#include <chrono>

4

#include <iostream>

5

6

std::atomic_flag lock = ATOMIC_FLAG_INIT;

7

8

void criticalSection() {

9

while (lock.test_and_set(std::memory_order_acquire)) {

10

// 自旋等待锁被释放

11

std::this_thread::yield(); // 提示调度器当前线程愿意放弃当前CPU资源的占用

12

}

13

// 临界区代码

14

lock.clear(std::memory_order_release); // 释放锁

15

}

在这个C++示例中,std::atomic_flag是一个原子的布尔类型,可以用作自旋锁的基础。test_and_set方法尝试设置标志并返回其之前的值,如果返回true,则表示锁已经被占用,当前线程需要继续自旋等待。一旦获取到锁,线程就可以安全地进入临界区。完成临界区的操作后,使用clear方法来释放锁。

请注意,自旋锁适用于短时间的临界区保护,因为在等待锁的过程中,线程会持续消耗CPU资源。如果临界区的执行时间较长或者锁的竞争很激烈,使用其他类型的锁(如互斥锁ÿ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39526.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析MySQL的数据类型:理解每种类型及其应用

MySQL是一种流行的关系型数据库管理系统&#xff0c;被广泛应用于Web应用开发中。在数据库设计的过程中&#xff0c;选择合适的数据类型至关重要&#xff0c;因为它不仅影响存储效率和数据完整性&#xff0c;还影响数据库操作的性能和查询速度。本文将详细介绍MySQL支持的各种数…

计算机网络期末复习2(武夷学院版)

第二章 物理层 1、物理层的主要任务&#xff08;书P69&#xff09; 物理层的主要任务就是确定与传输媒体的接口有关的一些特性&#xff0c;如机械特性、电气特性、功能特性和过程特性 2、有关信道的几个基本概念及其定义&#xff08;书P44&#xff09; 三种通信方式 单工通…

基于正点原子FreeRTOS学习笔记——时间片调度实验

目录 一、时间片调度介绍 二、实验演示 1、宏修改 1.1、滴答定时器宏 1.2、调度器宏 2、实验程序 2.1.1、任务1&#xff0c;任务2不加临界区程序 2.1.2 实验现象 2.2.1、任务1&#xff0c;任务2加临界区程序 2.2.2 实验现象 一、时间片调度介绍 时间片&#xff1a;同…

【Java集合类】ArrayList

方法 subList(int fromIndex, int toIndex) 可以看一下subList源码片段 public List<E> subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList<>(this, fromIndex, toIndex);} private static class SubList…

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

解析Kotlin中的内联函数,inline、noinline、crossinline【笔记摘要】

用编译时常量的概念&#xff0c;引出本文要讲内联函数inline&#xff1a; 1.编译时常量 Java的编译时常量 Compile-time Constant 它有四个要求&#xff1a;1.这个变量需要是 final 的  2.类型只能是字符串或者基本类型  3.这个变量需要在声明的时候就赋值  4.等号右边…

git提交实战

以新项目为例&#xff0c;如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

Java_多线程:线程池

1、线程池优点&#xff1a; 降低资源消耗&#xff1a;通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度&#xff1a;当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行。提高线程的可管理性&#xff1a;线程是稀缺资源&#xff0c;如果无限…

泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs

泰雷兹LunaHsm是业界首款通过FIPS140-33级认证的解决方案&#xff0c;安策引进泰雷兹HSM产品可以帮助您满足您的数据安全合规性需求&#xff0c;阻力企业提高竞争力。 安策提供泰雷茲ThalesLunaHSMs成为首个通过FIPS140-3三级认证的硬件安全模块图 我们很高兴地宣布&#xff0c…

面试题 1:阐述Python:except的用法和作用?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

mindspore打卡机器学习正则化与优化器

机器学习正则化 这段代码实现了一个深度学习实验&#xff0c;目的是使用不同的正则化技术&#xff08;包括dropout、批量归一化、L2正则化以及早期停止策略&#xff09;来训练神经网络模型&#xff0c;以拟合一个带有噪声的余弦波形数据集。代码使用MindSpore框架进行编写&…

分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】

U盘里面的数据丢失了怎么找回&#xff1f;随着数字化时代的深入发展&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储工具。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、病毒攻击等&#xff0c;U盘中的数据可能会丢失&#xff0c;给用户带来极大的困扰。…

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…

IDEA中SpringBoot项目数据库连接加密方法

1. maven添加相应版本的依赖 这里注意&#xff0c;不能使用太新的版本&#xff0c;本人开发环境使用3.0.3版本时&#xff0c;报以下错误&#xff0c;使用2.1.2时报错消失。 *************************** APPLICATION FAILED TO START ***************************Description:…

【Ubuntu】Ubuntu系统的127.0.1.1有什么用

参考Debian参考手册,Debian/Ubuntu系统下/etc/hosts内定义的127.0.1.1 IP为本机回环地址。 对于有静态IP地址的系统,应用静态IP替代这里的127.0.1.1. Debian参考手册部分截取: 5.1.1. 主机名解析 主机名解析,目前也是由 NSS (名字服务转换 Name Service Switch) 机制来支…

Yarn Scripts自动化:高效运行JavaScript任务的指南

引言 Yarn是一个现代的包管理工具&#xff0c;它不仅提供了快速可靠的包安装机制&#xff0c;还内置了一个强大的脚本运行工具。通过Yarn的脚本功能&#xff0c;开发者可以自动化执行各种任务&#xff0c;如测试、构建、清理等。本文将详细介绍如何使用Yarn的脚本运行工具来提…

Python容器 之 字典--字典的常用操作方法

1.增加和修改 字典[键] 值 键 存在, 修改 键 不存在, 添加 # 定义非空字典, 姓名, 年龄, 身高, 性别 my_dict {"name": "小明", "age": 18, "height": 1.78, "isMen": True} print(my_dict) # {name: 小明, age: 18, h…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务4:安装并配置JDK

任务描述 Hadoop 2.8需要JDK 1.6及以上版本的JDK&#xff0c;建议安装JDK 1.8&#xff0c;如果Cent OS是最小化安装&#xff0c;可能没有Open JDK&#xff0c;即使已经安装过Open JDK也可以使用JDK 1.8替换系统自带的Open JDK。 任务的内容为检查各个节点的JDK的安装情况&…

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…