【Linux】线程控制
多个线程访问临界资源时,存在资源竞争,造成数据错乱.
临界资源(全局变量,共享内存):多个线程可以同时操作的资源空间.
解决办法:多个线程访问临界资源时,进行排他性访问(同一时刻只允许一个线程对该临界资源进行访问)
一、互斥锁
解决多线程访问临界资源时,存在资源竞争
互斥锁使用流程:
1.创建互斥锁
2.初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); /****** 功能:初始化一个互斥锁 参数:restrict mutex:锁对象地址restrict attr:锁的属性(NULL) return:成功0失败非0******/
3.加锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
4.解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
5.销毁锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
异步:多任务各自执行各自的任务,互相之间没有直接干扰
同步:多个任务中的某些任务按照先后顺序执行
线程间同步:多个线程在某个任务执行过程中具有先后顺序
二、信号量sem
实现线程间同步(使用同步资源访问临界资源,可以达到互斥的效果)
信号量使用:
1.定义信号量对象
sem_t sem;
2.初始化信号量
#include <semaphore.h> int sem_init(sem_t *sem, int pshared, unsigned int value);/***** 功能:初始化信号量 参数:sem:信号量对象地址pshared: 0线程间使用非0进程间使用value:初始化的资源数 返回值:成功0失败-1 *****/
3.申请信号量:P操作
int sem_wait(sem_t *sem); /* 当申请的信号量资源数>0,sem_wait解除阻塞,表示申请到了该信号量,信号量资源数-1 当申请的信号量资源数=0,sem_wait阻塞等待信号量的释放 */
4.释放信号量:V操作
int sem_post(sem_t *sem); /* 该信号量的资源数自动+1 **/
5.销毁信号量
int sem_destroy(sem_t *sem);