多线程读写的时候 如何保证的数据的准确性?
线程同步
导入
<pre>
import <pthread.h>
</pre>
初始化
<pre>
pthread_mutex_init(&_lock, NULL);
</pre>
初始化
<pre>
pthread_mutex_destroy(&_lock);
</pre>
<pre>
pthread_mutex_t _lock;_YYLinkedMap *_lru;dispatch_queue_t _queue;
</pre>
_lock是互斥所,当涉及多线程执行代码的情况下,通过pthread_mutex_lock(&_lock)方法给下面的代码块加互斥锁,这样其它线程会被阻塞,直到
<pre>
pthread_mutex_unlock(&_lock)被调用。如下:
pthread_mutex_lock(&_lock);
//代码块1
pthread_mutex_unlock(&_lock);
pthread_mutex_lock(&_lock);
//代码块2
pthread_mutex_unlock(&_lock);
</pre>
线程A执行代码块1,线程B执行代码块2,如果线程A先执行代码块1,_lock被锁住,这样线程B被阻塞,直到线程A执行完代码块1后,调用pthread_mutex_unlock(_lock),线程B开始执行代码块2。由于执行缓存的操作很容易涉及到多线程调用,所以需要通过pthread_mutex_lock来控制,关于各种锁性能的测试,YYCache的作者ibireme大神在他的博客中进行了阐述。
YYCache通过在方法中添加互斥所的逻辑,来保证多线程操作缓存时数据的同步。例如在setObject:forKey:withCost:方法和objectForKey:中添加代码:
<pre>
- (void)setObject:(id)object forKey:(id)key withCost:(NSUInteger)cost {
pthread_mutex_lock(&_lock);
//操作链表,写缓存数据
pthread_mutex_unlock(&_lock);
} - (id)objectForKey:(id)key {
pthread_mutex_lock(&_lock);
//访问缓存数据
pthread_mutex_unlock(&_lock);
}
</pre>
网友评论