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