并发和竞态
来源:互联网 发布:怎么修改淘宝上的地址 编辑:程序博客网 时间:2024/05/17 22:21
app:
互斥量:
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_trylock(&mutex);
pthread_mutex_unlock(&mutex);
自旋锁:
pthread_spin_t spin;
pthread_spin_init(&spin, 0);
pthread_spin_lock(&spin);
pthread_spin_trylock(&spin);
pthread_spin_unlock(&spin);
加锁一定要避免死锁:
常见的死锁有:
1. ABBA
2. 进程自己递归加锁
加锁的粒度:
不能太大,太大有可能起步到保护作用;会降低程序的执行效率。
加锁是一种工程师的自愿工作,如果要加锁,一开始就要考虑。
kernel:
解决竞争实现同步的机制:
1. 原子操作
int i = 2; /*global*/
A process B process
//i++; i++;
ldr r0,[r1] ldr r0,[r1]
add r0,#1 add r0,#1
str r0,[r1] str r0,[r1]
i = 3; i = 4;
原子变量替换整形变量。
原子变量:
//int i = 2;
atomic_t v = ATOMIC_INIT(2);
原子操作函数接口:
//i += 3;
atomic_add(3, &v);
atomic_add_return();
atomic_add_negative();
atomic_inc();
atomic_inc_and_test();
atomic_inc_return();
2. 信号量
信号量属于睡眠锁,可以指定锁的持有者的个数。
实例化:
struct semaphore sema;
初始化:
sema_init(&sema, 1);
加锁解锁:
down()/up();
如果当前进程获得信号量暂时拿不到,睡。
3. 互斥量
睡眠锁
struct mutex;
使用互斥量锁的步骤:
实例化:
struct mutex mutex;
初始化:
mutex_init(&mutex);
加锁/解锁
mutex_lock(&mutex);/mutex_unlock(&mutex);
4. 自旋锁
非睡眠锁
实例化:
spinlock_t spin;
初始化:
spin_lock_init(&spin);
加锁:
//进程和进程
spin_lock(&spin);
spin_unlock(&spin);
//进程和进程,进程和中断处理函数的竞争
spin_lock_irqsave();
spin_unlock_irqrestore();
spin_lock_bh();
spin_unlock_bh();
- 并发和竞态
- 并发和竞态
- 并发和竞态
- 并发和竞态
- 并发和竞态
- 并发和竞态
- 并发和竞态
- 竞态和并发
- 并发和竞态
- 并发和竞态
- 并发和竞态控制
- 并发和竞态(理论篇)
- 并发和竞态(实践篇)
- 并发和竞态(理论篇)
- 并发和竞态(实践篇)
- Linux中的并发和竞态
- (LDD) 第五章、并发和竞态
- 第五章--并发和竞态
- 驱动模型
- C语言扫雷
- 【Android】Android插件开发 —— 打开插件的Activity(预注册方式)
- 利用linux 内核所提供的input子系统编写字符设备驱动的步骤
- linux 命令 多一个窗口
- 并发和竞态
- [笔记-架构探险]框架优化与功能扩展3.2.安全框架shiro、提供安全控制特性2-jsp页面标签和框架aop启用权限控制
- UVA - 253 Cube painting(骰子涂色)
- 此诊断出现在编译器生成的函数“CList<TYPE,ARG_TYPE> &CList<TYPE,ARG_TYPE>::operator =(const CList<TYPE,ARG_TYPE> &)”
- 内核定时器:
- Unable to start activity ComponentInfo 解决方法
- 收藏
- java中Object类与string类及其字符串处理方法
- Java中getResourceAsStream的用法