Day36_线程同步
来源:互联网 发布:linux mount phyaddr 编辑:程序博客网 时间:2024/05/21 21:02
Unix 线程同步技术:互斥量、信号量、条件变量(了解)
由于同一进程内部的多线程共享进程的资源,因此有可能出现共享数据的冲突,解决方案就是线程同步技术。互斥量是pthread.h自身提供的同步技术,信号量是外部提供的。同步技术的 基础方法就是把并行改为串行,所以 大幅降低效率。因此同步技术只用于限制对共享资源的使用
线程同步技术之互斥变量(锁):
互斥量的功能就是给临界资源加一把锁,只有第一个线程能使用,后面再来的线程阻塞,直到第一个线程释放互斥锁为止(解除阻塞后哪个线程能拿到互斥锁是不一定的)
互斥锁的使用步骤:
1.生命互斥量(mutex)
pthread_mutex_t lock;
2.初始化互斥量
pthread_mutex_init(&lock,0);
或在声明的同时赋值
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
3.上锁 pthread_mutex_lock(&lock);
4.使用共享资源
5.解锁 pthread_mutex_unlock(&lock);
6.释放互斥量占用的资源(回收互斥量)
pthread_mutex_destroy(&lock);
线程同步技术之信号量
信号量(semaphore) 本身就是一个计数器,控制访问共享资源的并行线程总数。信号量计数为1;效果等同于互斥量。
信号量不属于线程规范,头文件也不是 pthread.h,而是semaphore.h。
信号量使用步骤和互斥量差不多:
1 声明信号量
sem_t sem;
2 初始化信号量(初始化计数)
sem_init(&sem,0,n);
参数&sem是信号量的指针
第二个参数0 代表控制是线程,如果是其他值,代表控制是进程。
第三个参数n 是计数为n,最多n个线程并行。
3 获取信号量(计数减1)
sem_wait(&sem);
4 访问共享资源
5 释放信号量(计数+1)
6 回收信号量的资源
sem_destory(&sem);
关于 死锁
线程a和线程b代码如下:
a:
mutex lock1 lock2;
lock(&lock1);
lock(&lock2);
....
unlock
由于同一进程内部的多线程共享进程的资源,因此有可能出现共享数据的冲突,解决方案就是线程同步技术。互斥量是pthread.h自身提供的同步技术,信号量是外部提供的。同步技术的 基础方法就是把并行改为串行,所以 大幅降低效率。因此同步技术只用于限制对共享资源的使用
线程同步技术之互斥变量(锁):
互斥量的功能就是给临界资源加一把锁,只有第一个线程能使用,后面再来的线程阻塞,直到第一个线程释放互斥锁为止(解除阻塞后哪个线程能拿到互斥锁是不一定的)
互斥锁的使用步骤:
1.生命互斥量(mutex)
pthread_mutex_t lock;
2.初始化互斥量
pthread_mutex_init(&lock,0);
或在声明的同时赋值
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
3.上锁 pthread_mutex_lock(&lock);
4.使用共享资源
5.解锁 pthread_mutex_unlock(&lock);
6.释放互斥量占用的资源(回收互斥量)
pthread_mutex_destroy(&lock);
线程同步技术之信号量
信号量(semaphore) 本身就是一个计数器,控制访问共享资源的并行线程总数。信号量计数为1;效果等同于互斥量。
信号量不属于线程规范,头文件也不是 pthread.h,而是semaphore.h。
信号量使用步骤和互斥量差不多:
1 声明信号量
sem_t sem;
2 初始化信号量(初始化计数)
sem_init(&sem,0,n);
参数&sem是信号量的指针
第二个参数0 代表控制是线程,如果是其他值,代表控制是进程。
第三个参数n 是计数为n,最多n个线程并行。
3 获取信号量(计数减1)
sem_wait(&sem);
4 访问共享资源
5 释放信号量(计数+1)
6 回收信号量的资源
sem_destory(&sem);
关于 死锁
线程a和线程b代码如下:
a:
mutex lock1 lock2;
lock(&lock1);
lock(&lock2);
....
unlock
- Day36_线程同步
- 线程同步--线程同步--线程同步--线程同步--线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- linux下tcp,udp,icmp小例子
- Day35_多线程
- AsyncTask的参数介绍
- LCIS
- Java 内存管理
- Day36_线程同步
- Oracle插入大数据的方法总结
- Day37_数据库、select
- 如何将.sql文件导入powerdesigner的实现方法视图详解
- Java使用Json的方法
- windows 备份mysql
- 杭电1171
- 在 Eclipse 下利用 gradle 构建系统
- 从零开始学android:Android中的基本控件(上)