线程锁

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

一.互斥量 锁分为动态锁,通过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
    评论
Django是一个基于Python的开源Web应用框架,它提供了一套完整的工具和库,用于帮助开发人员快速构建高效、安全和可扩展的Web应用程序。 在Django中,线程锁是一种用于控制并发访问的机制,它可以确保在多个线程同时访问共享资源时的数据一致性和正确性。线程锁可以防止多个线程同时修改同一个资源,从而避免数据竞争和不一致的结果。 Django提供了多种线程锁的实现方式,其中最常用的是使用Python标准库中的`threading`模块提供的锁机制。通过使用`threading.Lock()`创建一个锁对象,并使用`acquire()`方法获取锁,在操作共享资源之前调用`acquire()`方法可以确保只有一个线程可以访问资源。在操作完成后,使用`release()`方法释放锁,以便其他线程可以获取锁并进行操作。 以下是一个简单的示例代码,演示了如何在Django中使用线程锁: ```python import threading # 创建一个全局锁对象 lock = threading.Lock() def my_view(request): # 获取锁 lock.acquire() try: # 执行需要保护的操作 # ... finally: # 释放锁 lock.release() ``` 在上述示例中,`my_view`是一个Django视图函数,通过获取锁对象并在需要保护的操作前后调用`acquire()`和`release()`方法,确保了在同一时间只有一个线程可以执行需要保护的操作。 需要注意的是,线程锁只能在同一个进程内的多个线程之间起作用,如果是多个进程之间的并发访问,需要使用进程锁或其他机制来实现并发控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值