iOS 互斥锁

多线程读写的时候 如何保证的数据的准确性?

线程同步

导入
<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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容