NSConditionLock 条件锁

有时候不是简单的需要 加锁/解锁, 而是需要根据一定条件满足后进行 加锁/解锁.

以一个生产中与消费者的例子,介绍条件锁的用法。

static NSInteger CONDITION_NO_DATA        //条件一: 没有数据
static NSInteger CONDITION_HAS_DATA       //条件二: 有数据

//初始化锁时,指定一个默认的条件
NSConditionLock *lock = [[NSConditionLock alloc] initWithCondition:CONDITION_NO_DATA];

//生产者,加锁与解锁的过程while (YES) {

    //1. 当满足 【没有数据的条件时】进行加锁
    [lock lockWhenCondition:CONDITION_NO_DATA];

    //2. 生产者生成数据
    //.....

    //3. 解锁,并设置新的条件,已经有数据了
    [locker unlockWithCondition:CONDITION_HAS_DATA];
}

//消费者,加锁与解锁的过程
while (YES) {

    //1. 当满足 【有数据的条件时】进行加锁
    [lock lockWhenCondition:CONDITION_HAS_DATA];

    //2. 消费者消费数据
    //.....

    //3. 解锁,并设置新的条件,没有数据了
    [locker unlockWithCondition:CONDITION_NO_DATA];
}

    

  

时间: 2024-08-30 06:28:18

NSConditionLock 条件锁的相关文章

递归锁+条件锁+互斥锁-04-多线程

1 // 2 // ViewController.m 3 // 05-递归锁(recursive)+条件锁(condition) 4 // 5 // Created by mac on 16/4/20. 6 // Copyright © 2016年 mac. All rights reserved. 7 // 8 /* 9 10 3). 互斥锁 11 NSLock *_lock; 12 13 3)NSLock :不能多次调用,会产生死锁 14 15 2016-04-20 16:06:44.600

条件锁类

#include <pthread.h> class CTestLock { public: CTestLock() { pthread_mutex_init(&mutex_t_, NULL); pthread_cond_init(&cond_t_, NULL); } ~CTestLock() { pthread_mutex_destroy(&mutex_t_); pthread_cond_destroy(&cond_t_); } int Lock() { in

条件锁

ReentrantLock类有一个方法newCondition用来生成这个锁对象的一个条件(ConditionObject)对象,它实现了Condition接口.Condition提供了线程通讯的一套机制await和signal等线程间进行通讯的方法.. 1.适用场景 当某线程获取了锁对象,但因为某些条件没有满足,需要在这个条件上等待,直到条件满足才能够往下继续执行时,就需要用到条件锁. 这种情况下,线程主动在某条件上阻塞,当其它线程发现条件发生变化时,就可以唤醒阻塞在此条件上的线程. 2.使用

条件锁condition与Queue()

在学习之前你应该先了解锁和队列基础 import queue import time import random import threading import asyncio import logging # from queue import Empty logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(levelname)s -->%(funcName)s at line %(lineno)d: \n %(

Golang sync.NewCond条件锁的用法

package main import ( "fmt" "sync" "time" ) func main() { c := sync.NewCond(&sync.Mutex{}) queue := make([]interface{}, 0, 10) removeFromQueue := func(delay time.Duration) { time.Sleep(delay) c.L.Lock() queue = queue[1:]

《GCD 实现同步锁》-07-多线程

@MicroCai 2015-03-03 23:18 字数 6539 阅读 202 Effective Objective-C Notes:GCD 实现同步锁 Archives iOS <Effective Objective-C Notes>系列博文整理自<Effective Objective-C 2.0> 如果您觉得我的博客对您有帮助,请通过关注我的新浪微博  MicroCai 支持我,谢谢! 本文名为<GCD 实现同步锁>,内容不止于锁.文章试图通过 GCD 同

Objective-C中不同方式实现锁(二)-11-多线程

1 Objective-C中不同方式实现锁(二) 2 3 在上一文中,我们已经讨论过用Objective-C锁几种实现(跳转地址),也用代码实际的演示了如何通过构建一个互斥锁来实现多线程的资源共享及线程安全,今天我们继续讨论锁的一些高级用法. 4 5 1.NSRecursiveLock递归锁 6 7 平时我们在代码中使用锁的时候,最容易犯的一个错误就是造成死锁,而容易造成死锁的一种情形就是在递归或循环中,如下代码: 8 9 1 10 2 11 3 12 4 13 5 14 6 15 7 16 8

iOS/Mac开发中各种锁的使用

NSRecursiveLock递归锁 所谓递归锁,就是在同一线程上该锁是可重入的,它对于不同线程相当于普通的互斥锁.NSRecursiveLock类定义的锁可以在同一线程多次lock,而不会造成死锁.递归锁会跟踪它被多少次lock.每次成功的lock都必须平衡调用unlock操作.只有所有的锁住和解锁操作都平衡的时候,锁才真正被释放给其他线程获得. NSRecursiveLock *lock = [[NSRecursiveLock alloc] init]; //开一个线程 dispatch_a

【转】iOS各种锁的比较

一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized.NSLock.dispatch_semaphore.NSCondition.pthread_mutex.OSSpinLock.后来网上查了一下,发现他们的实现机制各不相同,性能也各不一样.不好意思,我们平常使用最多的@synchronized是性能最差的.下面我们先分别介绍每个加锁方式的使用,在使用一个案例来对他们进行性能对比. 二.介绍与使用 2.1.@synchronized 1 2 3 4