Linux下的线程同步与互斥
来源:互联网 发布:pc端电视直播软件 编辑:程序博客网 时间:2024/05/15 11:09
Linux下线程同步方式:互斥锁、信号量、条件变量
一:线程
1.两个线程进行切换的时机
当进程从内核态返回用户态的时候,操作系统会自动检测是否要进行线程切换。 root在操作系统态时拥有最高权限,但是不能让root去运行用户代码,操作系统认为用户代码是不安全的。 在调用接口时,因为接口是操作系统提供的,所以就要切换用户态为内核态方可调用接口。(权限必须切换到内核态)。
二:访问临界资源
在访问临界资源时,一定要保证访问临界资源的原子性。
保证共享资源数据操作的完整性,任何时间只能有一个线程访问临界资源。
互斥锁(mutex):完成互斥功能
锁机制是同一时刻只允许一个线程执行一个关键部分的代码。
线程必须先获得互斥锁才能访问临界资源,访问该临界资源后释放该锁,如果无法获得锁线程就会一直等待直到获得锁为止。
互斥锁的使用:
创建—加锁—解锁 要明白什么时候加锁,什么时候解锁。
互斥锁也是一种临界资源,所以加锁和解锁也是原子的(既然互斥锁是用来保护临界资源的原子性,在保护别人安全下一定要先保证自己是安全的)。
某种程度上来说互斥锁相当于二元信号量,只不过二元信号量是用于进程的,互斥锁是用于线程的。
1. 初始化锁 int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr); 其中参数 mutexattr 用于指定锁的属性(见下),如果为NULL则使用缺省属性。 互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前有四个值可供选择: (1)PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。 (2)PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。 (3)PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。 (4)PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。 2. 阻塞加锁 int pthread_mutex_lock(pthread_mutex *mutex); 3. 非阻塞加锁 int pthread_mutex_trylock( pthread_mutex_t *mutex); 该函数语义与 pthread_mutex_lock() 类似,不同的是在锁已经被占据时返回 EBUSY 而不是挂起等待。 4. 解锁(要求锁是lock状态,并且由加锁线程解锁) int pthread_mutex_unlock(pthread_mutex *mutex); 5. 销毁锁(此时锁必需unlock状态,否则返回EBUSY) int pthread_mutex_destroy(pthread_mutex *mutex);
阅读全文
0 0
- Linux下线程互斥与同步
- Linux下的线程同步与互斥
- Linux下线程与进程同步与互斥
- linux下的同步与互斥
- Linux下的同步与互斥
- Linux下线程同步互斥
- Linux下的多线程编程二(线程的同步与互斥)
- linux下线程的同步和互斥
- Linux下线程的同步与互斥以及死锁问题整理
- linux线程互斥与同步---互斥锁
- linux线程同步与互斥
- linux线程互斥与同步
- Linux 线程同步与互斥
- linux线程互斥与同步---互斥锁
- Linux线程同步与互斥
- Linux线程同步与互斥
- Linux线程同步与互斥
- Linux之线程:同步与互斥
- phpstudy的80端口被占用
- 欢迎使用CSDN-markdown编辑器
- Gradle相关的配置文件
- 微信小程序实战:CMS系统开发-老孟编程
- 更改JS内部样式的写法
- Linux下的线程同步与互斥
- chrome jsonView插件安装
- 笑着理解设计模式-java--策略模式
- POI操作Excel相关API总结
- 获取浏览器地址栏get请求的数据并存在一个对象中
- 二分答案、三分法{神解}
- UVa 439 Knight Moves——bfs
- AttributeError: 'module' object has no attribute 'face' 问题解决 opencv+python
- ArcEngine之Com释放(1)