Linux中线程间通信与同步

一、线程间通信

使用全局变量实现多个线程间通信

1.资源

资源是有限的,程序运行过程中的CPU、内存、变量等等都可以看成是资源

2.临界代码、临界区

加锁、解锁中间的代码称为临界代码或临界区,同一时刻,不同线程中的临界区代码不会同时被执行

3.原子操作

不能被CPU任务调度所打断的一次最小的操作单元

4.互斥锁
1.pthread_mutex_init
 int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_                                  t *restrict attr);
  功能:
    初始化互斥锁
  参数:
    mutex:互斥锁变量空间首地址
    attr:属性  默认NULL
  返回值:
    成功返回0 
    失败返回错误码 
2.pthread_mutex_destroy
 int pthread_mutex_destroy(pthread_mutex_t *mutex);
  功能:
    销毁互斥锁
  参数:
    mutex:互斥锁空间首地址 
  返回值:
    成功返回0 
    失败返回错误码
3.pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);
  功能:
    上锁
  参数:
    mutex:锁资源空间首地址 
  返回值:
    成功返回0 
    失败返回错误码 
4.pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  功能:
    解锁
  参数:
    mutex:锁资源空间首地址 
  返回值:
    成功返回0 
    失败返回错误码 
5.死锁

多线程通信时,由于加锁导致多个任务无法继续向下执行,阻塞的状态成为死锁

死锁产生的必要条件:

1.互斥条件

2.不可剥夺条件

3.请求保持条件

4.循环等待条件

避免产生死锁:

1.多任务加锁顺序保持一致

2.使用pthread_mutex_trylock替代pthread_mutex_lock

6.互斥锁使用场景

多线程操作共享空间,加锁

二、线程同步

1.信号量

是一种资源,可以被申请、释放、初始化、销毁

2.函数接口
1.sem_init
int sem_init(sem_t *sem, int pshared, unsigned int value);
  功能:
    初始化信号量的值
  参数:
    sem:信号量空间的首地址
    pshared:
        0 线程间共享
        非0  进程间共享
    value:
        信号量的值
  返回值:
    成功返回0 
    失败返回-1 
2.sem_destroy
int sem_destroy(sem_t *sem);
  功能:
    信号量的销毁
  参数:
    信号量空间的首地址
  返回值:
    成功返回0 
    失败返回-1  
3.sem_wait
int sem_wait(sem_t *sem);
  功能:
    申请信号量
  参数:
    sem:信号量空间首地址
  返回值:
    成功返回0 
    失败返回-1 
4.sem_post
int sem_post(sem_t *sem);
  功能:
    释放信号量
  参数:
    sem:信号量空间首地址 
  返回值:
    成功返回0 
    失败返回-1  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值