zoukankan      html  css  js  c++  java
  • NSCondition

    一、NSCondition是对条件变量互斥量的一个封装,用于线程之间的同步。

      其中的互斥量用于保护对条件变量的修改,条件变量变化以信号量的方式通知其它线程实现线程之间的同步。

      

    二、NSCondition的API

      NSCondition实现了NSLocking协议,这个协议定义了lock和unlock方法,用于多个线程互斥得执行一段代码,以保护共享的数据。

      同时,NSCondition还包含以下方法:

      - (void)wait;

      - (BOOL)waitUntilDate:(NSDate *)limit;

      - (void)signal;

      - (void)broadcast;

      

      wait:释放互斥量,使当前线程等待,切换到其它线程执行。

      waitUntilDate:释放互斥量,使当前线程等待到某一个时间,切换到其它线程执行。

      signal:唤醒一个其它等待该条件变量的线程

      broadcast:唤醒所有其它等待该条件变量的线程

     

    三、demo 

      下面的例子来源于网络,对其做了一点修改

      

     1 int main(int argc, const char * argv[]) {
     2     @autoreleasepool {
     3         // insert code here...
     4         
     5         NSConditionSample *sample = [[NSConditionSample alloc] init];
     6         
     7         [NSThread detachNewThreadSelector:@selector(createConsumenr)
     8                                  toTarget:sample
     9                                withObject:nil];
    10         
    11         [NSThread detachNewThreadSelector:@selector(createProducter)
    12                                  toTarget:sample
    13                                withObject:nil];
    14         
    15  
    16         
    17         
    18         
    19         
    20         
    21         getchar();
    22     }
    23     return 0;
    24 }

      下面是生产者、消费者:

     1 #import "NSConditionSample.h"
     2 
     3 @interface NSConditionSample ()
     4 {
     5     NSCondition *condition;
     6     NSMutableArray *products;
     7 }
     8 
     9 @end
    10 
    11 
    12 @implementation NSConditionSample
    13 
    14 - (instancetype)init
    15 {
    16     if(self = [super init])
    17     {
    18         condition = [[NSCondition alloc] init];
    19         products = [[NSMutableArray alloc] init];
    20     }
    21     return self;
    22 }
    23 
    24 
    25 - (void)createConsumenr
    26 {
    27     while (YES) {
    28         NSLog(@"createConsumenr before lock");
    29         [condition lock];
    30         NSLog(@"createConsumenr after lock");
    31         while ([products count] == 0) {
    32             NSLog(@"wait for products");
    33             [condition wait];
    34         }
    35         [products removeObjectAtIndex:0];
    36         NSLog(@"comsume a product");
    37         [condition unlock];
    38     }
    39 }
    40 
    41 - (void)createProducter
    42 {
    43     while (YES) {
    44         NSLog(@"createProducter before lock");
    45         [condition lock];
    46         NSLog(@"createProducter after lock");
    47         [products addObject:[[NSObject alloc] init]];
    48         NSLog(@"produce a product");
    49         [condition signal];
    50         [condition unlock];
    51     }
    52 
    53 }
    54 
    55 @end

    执行的log:

    2015-07-24 11:05:48.374 NSConditionSample[45259:40628634] createConsumenr before lock

    2015-07-24 11:05:48.374 NSConditionSample[45259:40628635] createProducter before lock

    2015-07-24 11:05:48.374 NSConditionSample[45259:40628634] createConsumenr after lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] wait for products

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter after lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] produce a product

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter before lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] comsume a product

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] createConsumenr before lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter after lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] produce a product

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] createConsumenr after lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628635] createProducter before lock

    2015-07-24 11:05:48.375 NSConditionSample[45259:40628634] comsume a product

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] createConsumenr before lock

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] createProducter after lock

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] produce a product

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] createConsumenr after lock

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628635] createProducter before lock

    2015-07-24 11:05:48.376 NSConditionSample[45259:40628634] comsume a product

    2015-07-24 11:05:48.390 NSConditionSample[45259:40628634] createConsumenr before lock

    2015-07-24 11:05:48.390 NSConditionSample[45259:40628635] createProducter after lock

    2015-07-24 11:05:48.390 NSConditionSample[45259:40628635] produce a product

  • 相关阅读:
    201771030125-王英雪 实验一 软件工程准备一<构建之法与博客首秀>
    201771010102-常惠琢 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告
    201771010102-常惠琢 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    201771030104-道彤阳 实验四 软件项目案例分析
    201771030104-道彤阳 实验三 结对项目—《西北师范大学疫情防控信息系统》项目报告
    201771030104-道彤阳 实验二 个人项目—《西北师范大学学生疫情上报系统》项目报告
  • 原文地址:https://www.cnblogs.com/doudouyoutang/p/4672956.html
Copyright © 2011-2022 走看看