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


  作者:华清远见讲师

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

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

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

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

  具体的函数应用如下:

  信号量

  #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);

  功能:销毁条件变量。

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

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

  源文:http://www.embedu.org/column/3170.html

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值