前言
队列作为常用的数据结构,使用上较为广泛。以长连接通讯为例,为实现数据生成与发送处理上互不干涉,数据发送缓冲队列是一个较为常用的缓冲手段。在TPLine 投屏直播会议系统中,无论广播发送端还是广播接收端,都采用发送缓冲区实现数据生成后的缓冲发送工作。
入队与出队也通常运行在不同的线程中,为实现数据频繁的入队与出队操作而不出问题,锁定操作普通情况下是一种非常常用的手段。下面首先给出的就是以锁的方式实现队列的一些参考。以objective-c为例,在ios中没有线程wait/notifi的常用机制,取而代之的是以“信号量”的方式实现,这方面不作详细介绍了。Java标准库中已经实现这些具有并发访问且线程安全的API。
在TPLine 投屏直播会议系统开发的后期(因为项目太多,其实这个项目也就是有空的时候做一下而已),全面改用UDP的方式发送接收数据,为提升效率,改用了无锁队列作为发送缓冲。在下面会给出环形队列的部分代码。
队列的实现有多种方式,如链表和数组。这里以数组为例提供部分实现代码供大家参考。
缓冲队列
//
// CacheQueue.m
// Demo
//
// Created by Adam on 2019/6/21.
// Copyright © 2019年 Adam. All rights reserved.
//
#import "CacheQueue.h"
@interface CacheQueue()
@property(nonatomic, strong)NSMutableArray *pool;
@property(nonatomic, strong)dispatch_queue_t pushQueue;
@property(nonatomic, strong)dispatch_semaphore_t popSemaphore;
@property(nonatomic, strong)dispatch_semaphore_t pushSemaphore;
@end
@implementation CacheQueue
- (instancetype)init{
self = [super init];
if (self){
self.pool = [[NSMutableArray alloc] init];
self.pushQueue = dispatch_queue_create("push_queue", DISPATCH_QUEUE_SERIAL);
self.popSemaphore = dispatch_semaphore_create(0);
self.pushSemaphore = dispatch_semaphore_create(1);
}
return self;
}
- (void)push:(id<NSO