线程同步解决方案,简单测试

本来没打算测试这些方案的,因为各种方案的出现都是针对具体场景设计的,做同一场景的测试没有很大的必要,但看了网上很多博主的评测,感觉还是有必要简单整理一下。

补充

在线程同步的上一篇文章中提到了读写锁,也是线程同步解决方案之一,没有做详细整理,后来查了一下pthread库,里面是有提供读写锁pthread_rwlock的,在这做一下补充。此外pthread库里还有pthread_cond也可以实现线程同步,有兴趣可以查阅了解。

pthread_rwlock

特性

读写锁的设计是为了解决在既有读又有写的场景,读的操作明显比写的操作多,保证多线程在没有写操作的时候可以同时做读操作。

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 创建
pthread_rwlockattr_t attr;
pthread_rwlockattr_init(&attr);
pthread_rwlock_init(&_mutex, &attr);
pthread_rwlockattr_destroy(&attr);
// 读操作
pthread_rwlock_rdlock(&_mutex);
id obj = [dict objectForKey:@"trial"];
pthread_rwlock_unlock(&_mutex);
// 写操作
pthread_rwlock_wrlock(&_mutex);
[dict setObject:@"boz" forKey:@"trial"];
pthread_rwlock_unlock(&_mutex);
// 释放
pthread_rwlock_destroy(&_mutex);

简单测试

测试方法

测试方法很简单,在这口述一下,测试代码有点乱,就不整理了。

  • 测试设备:iPhone6s iOS 9.3.2。
  • 测试场景:选择Objective-C中NSMutableDictionary的读写,首先继承NSMutableDictionary实现NSMutableDictionary的子类,覆写读写方法,读写操作用各种不同的线程同步方案包装,然后写测试代码。先在主线程中对NSMutableDictionary的对象实例做100000次的读写操作,测得操作执行时间,然后针对每种方案会启多个线程对同一NSMutableDictionary子类对象实例做10000次读写操作,随后在主线程中做100000次读写操作,测得主线程读写操作执行时间。
  • 数据整理:每种方案的时间减去普通NSMutableDictionary对象读写操作的时间。

测试结论

最终的测试结果大概如下图所示:

测试结果

如上图显示,OSSpinLock、dispatch_semaphore、pthread_rwlock的速度明显靠前,但网上说pthread_mutex应该是仅次于OSSpinLock,不知道是测试方法还是场景的原因,并没有得出同样的结论,嘛,反正就这样吧。

最后,以上测试结果仅供参考!!!