线程间通信(linux进程与线程学习笔记)

 线程间通信
 
    线程共享同一进程的地址空间
    
    优点:线程间通信很容易
    
        通过全局变量交换数据
        
    缺点:多个线程访问共享数据时需要同步或互斥机制
    
 线程通信 - 同步
 
    同步指的是多个任务按照约定的先后次序互相配合完成一件事情
    
    1968年,Edsgar Dijkstra基于信号量的概念提出了一种同步机制
    
    有信号量来决定线程是继续运行还是阻塞等待
    
 信号量(灯)
 
    信号量代表某一类资源,其值表示系统中该资源的数量
    
    信号量是一个受保护的变量,只能通过三种操作来访问
    
        初始化
        
        P操作(申请资源)
        
        V操作(释放资源)
        
 信号量 - P/V操作
 
    P(S)含义如下:
    
        if(信号量的值大于0){
            申请资源的任务继续运行;
            信号量的值减一;
        }else{
            申请资源的任务阻塞;
        }
        
    V(S)含义如下:
    
        信号量的值加一;
        if(有任务在等待资源){
            唤醒等待的任务,让其继续运行;
        }
        
 Posix 信号量
 
    posix中定义了两类信号量:
    
        无名信号量(基于内存的信号量)
        
        有名信号量
        
    pthread库常用的信号量操作函数如下:
    
        int sem_init(sem_t *sem,int pshared,unsigned int value);
        
        int sem_wait(sem_t *sem);//P操作
        
        int sem_post(sem_t *sem);//V操作
        
 信息量初始化 - sem_init
 
    #include<semaphore.h>
    
    int sem_init(sem_t *sem,int pshared,unsigned int value);
    
    成功时返回0,失败时返回EOF
    
    sem 指向要初始化的信号量对象
    
    pshared 0-线程间 1-进程间
    
    value 信号量初值
    
 信号量 - P/V操作
 
    #include<semaphore.h>
    
    int sem_wait(sem_t *sem);//P操作
        
    int sem_post(sem_t *sem);//V操作
    
    成功时返回0,失败时返回EOF
    
    sem 指向要操作的信号量对象
    
 线程通信 - 互斥
 
    临界资源
    
        一次只允许一个任务(进程、线程)访问的共享资源
        
    临界区
    
        访问临界资源的代码
        
    互斥机制
    
        mutex互斥锁
        
        任何访问临界资源前申请锁,访问完后释放锁
        
 互斥锁初始化 - pthread_mutex_init
 
    #include<pthread.h>
    
    int pthread_mutex_init(pthread_mutex_t *mutex,
    const pthread_mutex_t *attr);
    
    成功时返回0,失败时返回错误码
    
    mutex 指向要初始化的互斥锁对象
    
    attr互斥锁属性,NULL表示缺省属性
    
 申请锁 - pthread_mutex_lock
 
    #include<pthread.h>
    
    int pthread_mutex_lock(pthread_mutex_t *mutex);
    
    成功时返回0,失败时返回错误码
    
    mutex 指向要初始化的互斥锁对象
    
    如果无法获得锁,任务阻塞,直到获得锁
    
 释放锁 - pthread_mutex_unlock
    
    #include<pthread.h>
    
    int pthread_mutex_unlock(pthread_mutex_t *mutex);
    
    成功时返回0,失败时返回错误码
    
    mutex 指向要初始化的互斥锁对象
    
    执行完临界区要及时释放锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值