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

  作者:华清远见讲师

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

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

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

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

  具体的函数应用如下:

  信号量

  #include

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

  功能:信号量的初始化。

  参数:

  sem:就是信号量的标识符

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

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

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

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

  int
sem_wait(sem_t *sem);

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

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

  参数:sem:

  int
sem_trywait(sem_t *sem);

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

  int
sem_post(sem_t *sem);

  功能:释放信号量资源

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

  int
sem_getvalue(sem_t *sem, int *svalue);

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

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

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

  int
sem_destroy(sem_t *sem);

  功能:销毁无名信号量。

  线程互斥锁

  int
pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t
*restrict attr);

  功能:产生一把锁

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

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

  pthread_mutex_t
lock;

  pthread_mutex_init(&lock,
NULL);

  int
pthread_mutex_lock(pthread_mutex_t *mutex);

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

  int
pthread_mutex_unlock(pthread_mutex_t *mutex);

  功能:解锁。

  int
pthread_mutex_destroy(pthread_mutex_t *mutex);

  功能:就是销毁一把锁。

  条件变量:

  int
pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict
attr);

  功能:初始化条件变量。

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

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

  pthread_cond_t
cond;

  pthread_cond_init(&cond,
NULL);

  int
pthread_cond_signal(pthread_cond_t *cond);

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

  int
pthread_cond_broadcast(pthread_cond_t *cond);

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

  int
pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict
mutex);

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

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

  mutex:就是一个锁。

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

  int
pthread_cond_destroy(pthread_cond_t *cond);

  功能:销毁条件变量。

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

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

  源文:http://***column/3170.html

  >>>更多优秀技术博文每日更新

时间: 2024-10-10 00:14:12

线程间通信的定义及全局变量的方法的相关文章

线程间通信的实现 wait()和notify()方法

Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题.这3个方法分别是:wait().notify()和notifyAll().它们都是Object类的最终方法,因此每一个类都默认拥有它们. 虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中搭配使用这3个方法时才有实际的意义. 如果对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态. 如果对象调用了notify方法就会通知某个正在等待这个对象的

Java线程间通信之wait/notify

Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式.先来我们来看下相关定义: wait() :调用该方法的线程进入WATTING状态,只有等待另外线程的通知或中断才会返回,调用wait()方法后,会释放对象的锁. wait(long):超时等待最多long毫秒,如果没有通知就超时返回. notify() : 通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前

【转】VC 线程间通信的三种方式

原文网址:http://my.oschina.net/laopiao/blog/94728 1.使用全局变量(窗体不适用)      实现线程间通信的方法有很多,常用的主要是通过全局变量.自定义消息和事件对象等来实现的.其中又以对全局变量的使用最为简洁.该方法将全局变量作为线程监视的对象,并通过在主线程对此变量值的改变而实现对子线程的控制.      由于这里的全局变量需要在使用它的线程之外对其值进行改变,这就需要通过volatile关键字对此变量进行说明.使用全局变量进行线程通信的方法非常简单

线程间通信与同步

线程间通信的两个基本问题是互斥和同步. 同步:一个线程的执行依赖于另一个线程的消息. 互斥:对共享资源的排他性,一个线程必须等待别的线程释放公共资源之后才能继续执行. 同步机制(Win32中):事件,信号量,互斥量,临界区 各种同步方式: #全局变量 win32多线程通信的最方式,但用全局变量同步会有两个弊端,应该避免 >主线程没有进入休眠状态,依然会消耗CPU资源 >如果主线程优先级比ThreadFunc高,则全局变量无法在ThreadFunc中被改变,这样线程无法得到通知 #事件 由于ev

Java笔记七.线程间通信与线程生命的控制

线程间通信与线程生命的控制 一.线程通信方法 Java是通过Object类的wait.notify.notifyAll这几个方法来实现进程键的通信.由于所有的类都是从Object继承的,因此在任何类中都可以直接使用这些方法. wait:告诉当前线程放弃监视器并进入睡眠状态,知道其他线程进入同一监视器并调用notify为止; notify:唤醒同一对象监视器中调用wait的第一个线程.用于类似饭馆有一个空位后通知所有等候就餐的顾客中的第一位可以入座的情况: notifyAll:唤醒同一对象监视器中

线程间通信机制posix匿名信号量

信号量分为两种 一种是简单的信号量,另一种是用于进程间通信的信号量集. 简单的信号量 属于POSIX标准的信号量; 从信号量的命名来看,信号量又可分为命名信号量和匿名(未命名)信号量; 从信号量的值来看,信号量可分为二进制信号量和计数信号量; 1.匿名信号量和命名信号量: 匿名信号量是在内存中分配内存.进行初始化并由系统API进行管理的,它可以在多个线程之间进行资源同步,也可以在多个进程之间进行资源同步,这主要是看在初始化的时候给pshared传递的参数值,为0,则在线程之间同步,非0,则在进程

进程间通信和线程间通信

进程间通信: # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.#

多线程-线程间通信

1.多线程-线程间通信-问题演示 多线程间通信:多个线程处理同一资源,但是处理动作却不同. //创建一个资源描述.资源中有name sex.用于存储数据. class Resource{     String name;     String sex; } //需要定义一个输入任务描述.既然是线程任务,必须实现Runnable接口.  class Input implements Runnable{     private Resource r;     Input(Resource r){  

多线程-线程间通信-多生产者多消费者示例

1.多线程-线程间通信-多生产者多消费者问题 多生产者和多消费者.等待唤醒机制. 产生了两个问题: 1.出现了多次连续生产,未消费,或者一个商品被消费多次. 解决:必须要--------每一个被唤醒的线程判断一次标记,所以将if判断改为while判断. 2.出现了死锁. 本方唤醒了本方,导致了所有的线程都等待了. 解决方式就是:唤醒所有等待的线程.这样既唤醒了本方也唤醒对方. 虽然解决了多生产消费的问题,但是有些低效. 解决方法一: 唤醒所有等待的线程 class Resource{     p