线程锁

来源:互联网 发布: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);//写完数据后,唤醒等待读的线程

四.自旋锁,用户态基本不用。

0 0
原创粉丝点击