线程锁
来源:互联网 发布:java round 编辑:程序博客网 时间:2024/04/30 07:49
对于一个线程读,一个线程写的情况要加锁。
一.互斥量 锁分为动态锁,通过malloc生成。需要调用pthread_mutex_init和pthread_mutex_destory来初始化和销毁。
静态锁pthread_mutex_t mutexa=PTHREAD_MUTEX_INITIALIZER.不用初始化和销毁。
1.线程锁函数
pthread_mutex_init(pthread_mutex_t *mutex,NULL);//0成功,
pthread_mutex_destory(mutex)//0成功 动态分配的如malloc mutex,要调用这个函数
pthread_mutex_trylock(mutex).
pthread_mutex_lock(mutex)
pthread_mutex_unlock(mutex).//都是成功返回0
2.避免死锁,如每个线程都要处理多个锁。1.每个线程都保证多个锁的加锁顺序一致,如都是先锁a,再锁b. 2.在锁b之前,要先pthread_mutex_trylock b。如果失败,先解锁a.
二。读写锁。当读写锁被加写锁时,其他线程不能对其加锁。当读写锁被加读锁时,其他线程可以对其加读锁,但不能加写锁。这种锁适合读次数远大于写次数的情况。
三.条件变量。当一个线程读队列,一个线程写队列,写队列写完后通知读队列有数据了,读队列才开始读。这种需要通知的情况下需要用条件变量。通常和互斥量联合使用。
函数:
pthread_cond_t cond= PTHREAD_COND_INITIALIZER;//静态条件变量。
pthread_cond_init(&cond,NULL);//动态条件变量初始化。
pthread_cond_destory(&cond);//动态注销
pthread_cond_wait(&cond,&mutex);//等待被通知
pthread_cond_timewait(&cond,&mutex,tsptr);//带超时的等待被通知
pthread_cond_signal(&cond);//通知有数据了。至少唤醒一个等待该条件的线程
pthread_cond_broadcast(&cond);//唤醒所有等待该条件的线程。
以上都是成功返回0,失败返回错误编号
用法:
读数据
pthread_mutex_lock(&mutex);
while(queue == NULL)
pthread_cond_wait(&cond,&mutex);//如果没数据,会暂时是否mutex.被加入等待队列
读数据
pthread_mutex_unlock(&mutex)
写数据:
pthread_mutex_lock(&mutex);
写数据
pthread_mutex_unlock(&mutex);
pthread_cond_signal(&cond);//写完数据后,唤醒等待读的线程
四.自旋锁,用户态基本不用。