线程锁

对于一个线程读,一个线程写的情况要加锁。

一.互斥量 锁分为动态锁,通过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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值