android中的进程互斥实现
来源:互联网 发布:淘宝海淘代购 编辑:程序博客网 时间:2024/06/03 18:58
Futex系统调用
Futex是一种用户态和内核态混合机制,所以需要两个部分合作完成,linux上提供了sys_futex系统调用,对进程竞争情况下的同步处理提供支持。
其原型和系统调用号为
#include <linux/futex.h>
#include <sys/time.h>
int futex (int *uaddr, int op, int val, const struct timespec *timeout,int *uaddr2, int val3);
#define __NR_futex 240
虽然参数有点长,其实常用的就是前面三个,后面的timeout大家都能理解,其他的也常被ignore。
uaddr就是用户态下共享内存的地址,里面存放的是一个对齐的整型计数器。
op存放着操作类型。定义的有5中,这里我简单的介绍一下两种,剩下的感兴趣的自己去man futex
FUTEX_WAIT: 原子性的检查uaddr中计数器的值是否为val,如果是则让进程休眠,直到FUTEX_WAKE或者超时(time-out)。也就是把进程挂到uaddr相对应的等待队列上去。
Futex是一种用户态和内核态混合机制,所以需要两个部分合作完成,linux上提供了sys_futex系统调用,对进程竞争情况下的同步处理提供支持。
其原型和系统调用号为
#include <linux/futex.h>
#include <sys/time.h>
int futex (int *uaddr, int op, int val, const struct timespec *timeout,int *uaddr2, int val3);
#define __NR_futex 240
虽然参数有点长,其实常用的就是前面三个,后面的timeout大家都能理解,其他的也常被ignore。
uaddr就是用户态下共享内存的地址,里面存放的是一个对齐的整型计数器。
op存放着操作类型。定义的有5中,这里我简单的介绍一下两种,剩下的感兴趣的自己去man futex
FUTEX_WAIT: 原子性的检查uaddr中计数器的值是否为val,如果是则让进程休眠,直到FUTEX_WAKE或者超时(time-out)。也就是把进程挂到uaddr相对应的等待队列上去。
FUTEX_WAKE: 最多唤醒val个等待在uaddr上进程。
#include <sys/atomics.h>
#include<sys/mman.h>
volatile int * lock;
extern int futex (volatile int *uaddr, int op, int val, const struct timespec *timeout,int *uaddr2, int val3);
function init_lock() {
int fd = open("/lock", O_RDWR);
if (fd > 0) {
lock = (int*)mmap(0, 4, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, g_fd, 0);
if (lock)
lock[0] = 1;
}
}
}
void mutex_lock(volatile int *lock) {
futex(lock, FUTEX_WAIT, 0, 0, 0, 0);
__atomic_dec(lock);
}
void mutex_unlock(volatile int *lock) {
__atomic_inc(lock);
futex(lock, FUTEX_WAKE, 1, 0, 0, 0);
}
- android中的进程互斥实现
- windows实现进程互斥
- FileLock实现进程互斥
- 【进程管理】内核中的互斥操作
- 进程互斥----ttylock()类似原理实现
- 利用Swap指令进程互斥实现
- 进程互斥问题
- 同名进程互斥
- 进程互斥
- 进程同步 & 互斥
- 进程互斥
- 进程互斥
- 进程互斥
- 进程互斥问题
- 进程(线程)互斥的软件实现--皮特森(Peterson)算法
- 用java实现管程,解决进程互斥问题
- 进程的PV操作及互斥同步实现
- 浅谈两种方法实现进程互斥的原理
- java设计模式—工厂模式
- Apache的Order Allow Deny心得
- Dreamweaver 5.5 + JQuery + PhoneGap 开发手机应用程序
- 第十一届中国互联网软件洽谈会在京成功召开
- nfs挂载文件系统 笔记
- android中的进程互斥实现
- HTML 和 XHTML 区别
- 一个table中去重
- 前端代码标准最佳实践:javascript篇
- VC多字节字符串和宽字节字符串转换
- 代码
- 忽略大小写的字符串比较
- java原理—反射机制
- Linux下Samba的配置