IOS 多线程 锁 互斥 同步

方法一,@synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全

1 @synthesize(self)
2     {
3         //这段代码对其它 @synthesize(self) 都是互斥的
4
5         //self 指向同一个对象
6     }

方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:
lock,加锁
unlock,解锁
tryLock,尝试加锁,如果失败了,并不会阻塞线程,会立即返回NO
lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO

1     NSLock *thisLock = [[NSLock alloc] init];
2     if ([thisLock lock]) {
3
4         //这里添加你所需要的代码即可
5
6         [thisLock unlock];
7
8     }

方法三,NSRecursiveLock,递归锁
NSRecursiveLock,多次调用不会阻塞已获取该锁的线程。

 1     NSRecursiveLock *theLock = [[NSRecursiveLock alloc] init];
 2     void myFunction(int value)
 3     {
 4         [theLock lock];
 5         if (value != 0)
 6         <span style=@"font-size:14px"></span>{
 7             -value ;
 8             myFunction(value) ;
 9         }
10
11         [theLock unlock];
12     }
13
14     myFunction(5) ;

方法四,NSDistributedLock,分布锁
NSDistributedLock,分布锁,文件方式实现,可以跨进程
用tryLock方法获取锁。
用unlock方法释放锁。
如果一个获取锁的进程在释放锁之前挂了,那么锁就一直得不到释放了,此时可以通过breakLock强行获取锁。

方法五,NSConditionLock,条件锁
NSConditionLock,条件锁,可以设置条件

 1 //公共部分
 2     id conditionLock = [[NSConditionLock alloc] initWithCondition:NO_DATA];
 3     //线程一,生产者
 4     while (true) {
 5         [conditionLock lockWhenCondition:NO_DATA];
 6         //生产数据
 7         [conditionLock unlockWithCondition:PRO_DATA];
 8     }
 9
10     //线程二,消费者
11     while (true) {
12
13         [conditionLock lockWhenCondition:PRO_DATA];
14         //消费
15         [conditionLock unlockWithCondition:NO_DATA];
16     }
时间: 2024-10-22 10:46:09

IOS 多线程 锁 互斥 同步的相关文章

多线程的互斥同步(存款取款基础版)

1.互斥:多个线程同时访问一个资源的时候,由于线程执行的不稳定,使得资源数据遭到破坏: 经典的例子:银行的存款和取款(两个线程访问一个1000元账户,A线程取200,B线程寸300,由于线程执行的不稳定,在A执行到取出1000-200的操作时, (此时还未将执行结果保存到账户)CPU执行权到B线程,B取到的还是1000 +300 = 1300....).为了防止这种情况,应该将互斥的资源加上同步锁 1 package com.thread; 2 /** 3 * 模拟同步取款的问题 4 * @au

[java多线程] - 锁机制&amp;同步代码块&amp;信号量

在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同步代码块机制,锁机制,信号量机制. 一.同步代码块 在java的多线程并发开发过程中,我们最常用的方式就是使用同步代码关键字(synchronized).这种方式的使用不是特别复杂,需要注意的只是你需要明确到底同步的是那个对象,只有当同步的对象一致的情况下,才能够控制互斥的操作.一般情况下,我们会同

IOS 多线程,线程同步的三种方式

一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IOS中我们一般情况下使用以下三种线程同步代码方式: 第一种和第二种代码同步的使用方法,一般情况下我们只需要使用NSLock和NSCondition申明2个属性.然后给此属性赋对应的值.那么即可作为安全防控的线程手段. 同时也可以保证线程的资源安全. 1:NSLock方式 [xxxlock   lock] //上锁 同步代码块 [xxxlock   unlock]//解锁 2:NSCondition

IOS多线程--锁

NSLock (0)为什么上锁 1.atomic(原子操作)是指不会被线程机制打断,这种操作一旦开始就运行到结束,中间不会有任何的切换 2.我们可以通过(NSLock)使这段代码成为原子操作 3.使用线程锁,不是服务于线程,而是服务于代码,如果我们想对一段代码进行原子从操作的时候(数据库的写入)就可以加锁 [email protected](互斥锁)也能实现原子操作,但是关键字不能在一个函数中加锁,然后在另一个函数中解锁,lock就能实现 (1)创建(线程锁,多个线程有一把锁就够了,谁锁谁打开)

iOS多线程同步锁

在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安全 [cpp] view plaincopyprint? @synchronized(self) { // 这段代码对其他 @synchronized(self) 都是互斥的 // self 指向同一个对象 } 方法二,NSLockNSLock对象实现了NSLocking protocol,包含几个方法:l

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

线程同步-iOS多线程编程指南(四)-08-多线程

首页 编程指南 Grand Central Dispatch 基本概念 多核心的性能 Dispatch Sources 完结 外传:dispatch_once(上) Block非官方编程指南 基础 内存管理 揭开神秘面纱(上) 揭开神秘面纱(下) iOS多线程编程指南 关于多线程编程 线程管理 Run Loop 线程同步 附录 Core Animation编程指南 Core Animation简介 基本概念 渲染架构 几何变换 查看目录 中文手册/API ASIHTTPRequest Openg

iOS多线程开发小demo4,线程的同步问题

// DYFViewController.m // 623-05-线程同步问题 // // Created by dyf on 14-6-23. // Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (nonatomic, assign) int leftCount

iOS多线程编程:线程同步总结 NSCondtion

1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一变量进行操作,可以保证一个线程的操作不会影响到其他线程内对此变量的操作,因为这些操作都是原子式的.因为原子操作只能对内置类型进行操作,所以原子操作能够同步的线程只能位于同一个进程的地址空间内. 2:锁 - NSLock系列对象 iOS平台下的锁对象为NSLock对象,进入锁通过调用lock函数,解锁调用unl