iOS开发中使用pthread_cond_t解决生产者-消费者问题

简单地回顾一下经典的生产者-消费者问题
一个线程负责生产,一个线程负责消费,操作的是同一个数据源,最后要保证生产的所有商品都被消费者买掉即数据源中没有数据。

开发中要怎么解决这个问题呢?

因为是多个线程多同一个数据进行操作,所以为了保证线程的安全肯定是需要上锁的。其次在有数据的时候消费者的线程操作才能进行,所以本篇文章就利用pthread_cond_t(条件)来解决这个问题。
首先还是需要利用pthread_mutex_t进行加锁的,pthread_cond_t需要进行初始化

  // 初始化条件
pthread_cond_init(&_cond, NULL);

看核心代码:

  - (void)testCondition{
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue, ^{
    for (NSInteger i = 0; i < 10; i ++) {
        [self add];
    }
});
dispatch_async(queue, ^{
    for (NSInteger i = 0; i < 10; i ++) {
        [self remove];
    }
});
}
  // 生产者消费者模式

- (void)add{
pthread_mutex_lock(&_mutex);
NSLog(@"%s---%@", __func__, [NSThread currentThread]);
[self.mutableArr addObject:@"123"];
NSLog(@"数组中的元素:%@", self.mutableArr);
pthread_cond_signal(&_cond);
pthread_mutex_unlock(&_mutex);
}
- (void)remove{
pthread_mutex_lock(&_mutex);
NSLog(@"%s---%@", __func__, [NSThread currentThread]);
if (self.mutableArr.count == 0) {
    pthread_cond_wait(&_cond, &_mutex);
}
[self.mutableArr removeLastObject];
NSLog(@"数组中的元素:%@", self.mutableArr);
pthread_mutex_unlock(&_mutex);
}
分析代码

首先分析remove方法,如果数据源中没有数据,那么就要使用pthread_cond_wait进行等待,同时解锁,这样另一个线程中的操作add就可以执行了。当数据源中有了数据以后就可以通过pthread_cond_signal通知之前等待的线程可以继续执行了,同时当前线程会继续往下执行。

附上一个小demo:https://gitee.com/liangsenliangsen/pthread_cond_t

你可能感兴趣的:(iOS开发中使用pthread_cond_t解决生产者-消费者问题)