android线程间通信 信号量,线程间通信的定义及全局变量的方法

作者:华清远见讲师

多进程和多线程是系统执行多任务机制的重要手段,多任务同时进行自然少不了相互之间的通信工作。下面先将线程间的通信方式总结一下,便于大家对比学习。

首先来说线程间的通信。因为多个线程是共享进程的空间的,所以线程之间的通信比较简单,主要是利用全局变量的方法。全局变量对进程内的的所有线程都是可见的,所以多个线程可以通过操作全局变量达到相互通信的效果。但是这也存在一个问题,就是“资源”的竞争。

这里所说的资源指的就是全局变量,正是因为这种竞争(因为多线程是同时运行的,而我们往往不会去控制线程运行的顺序,不然也不会用多线程了),导致可一些我们不愿见到的结果,所以我们每个线程对全局变量的操作都希望是原子性的。

为了解决这个问题在线程见引入了三种同步互斥机制,分别是信号量,互斥锁,条件变量。

具体的函数应用如下:

信号量

#include

intsem_init(sem_t *sem, int pshared, unsigned int value);

功能:信号量的初始化。

参数:

sem:就是信号量的标识符

pshared:0,表示该信号量用于线程之间的通信。

非0, 表示该信号量用于进程程之间的通信。

value:非负的整数,就是信号量的初值。

如果为0, 表示没有资源。

intsem_wait(sem_t *sem);

功能:阻塞申请信号量资源, 当信号量的值等于0时,睡眠等待。

一旦申请成功,那么信号量的值就会被减1.

参数:sem:

intsem_trywait(sem_t *sem);

功能:非阻塞申请信号量资源,如果申请不到资源,那么该函数立刻返回。

intsem_post(sem_t *sem);

功能:释放信号量资源

释放成功,信号量的值加1.

intsem_getvalue(sem_t *sem, int *svalue);

功能:获得当前信号量的值。

参数:sem,指定要获得的信号量

svalue,用于保存获得的信号量的值。

intsem_destroy(sem_t *sem);

功能:销毁无名信号量。

线程互斥锁

intpthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t*restrict attr);

功能:产生一把锁

参数:mutex: 线程锁的标识符

attr:设置线程锁的属性,通常为NULL。

pthread_mutex_tlock;

pthread_mutex_init(&lock,NULL);

intpthread_mutex_lock(pthread_mutex_t *mutex);

功能:上锁, 阻塞等待,直到能够得到这把锁。

intpthread_mutex_unlock(pthread_mutex_t *mutex);

功能:解锁。

intpthread_mutex_destroy(pthread_mutex_t *mutex);

功能:就是销毁一把锁。

条件变量:

intpthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrictattr);

功能:初始化条件变量。

参数:cond:条件变量的标识符

atrr:条件变量的属性,通常为NULL。

pthread_cond_tcond;

pthread_cond_init(&cond,NULL);

intpthread_cond_signal(pthread_cond_t *cond);

功能:就是给一个需要该条件变量的线程发送唤醒的信号。

intpthread_cond_broadcast(pthread_cond_t *cond);

功能:给所有需要该条件变量的线程都发送唤醒信号。

intpthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrictmutex);

功能:就是导致线程睡眠在此函数上,直到有线程给它发送条件变量的唤醒信号。

参数:cond:需要改条件变量

mutex:就是一个锁。

pthread_cond_wait():先将锁解开,然后进入睡眠,当被唤醒的时候需要重新加锁(如果此时得不到锁,那么继续睡眠)。

intpthread_cond_destroy(pthread_cond_t *cond);

功能:销毁条件变量。

这些函数的具体用法在上课时候我们已经学过,不再做更为具体的介绍,希望同学们多加练习。这里主要是总结下三者的应用。

这三种机制中,信号量和条件变量属于一种阻塞通知的机制。采用阻塞的方法,让一个进程中只有一个线程能“顺利执行”,执行完毕后再通知其他线程执行。而互斥锁是典型的互斥机制,对资源加以保护,在这期间不允许其他现场对保护的内容进行读写操作。通过信号量和条件变量都可以实现经典的生产者消费者模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值