unix 环境中线程间通方式整理

来源:互联网 发布:触摸查询一体机软件 编辑:程序博客网 时间:2024/06/08 01:10

线程间通信常见的同步方式有:互斥锁、条件变量、信号量、管通。


一、 互斥量(Mutex)

通常互斥量和条件变量在多线程中是一块使用的。


二、 条件变量

http://blog.chinaunix.net/uid-20321537-id-1966816.html

三、 信号量

http://blog.csdn.net/jasenwan88/article/details/7766808

  英文:semaphore,它是一种专门用于提供不同进程间或线程间同步手段的原语。可以通过下图来理解它。

        进程A                               进程B

          \          /

     进程    \         /

        ----------------------------------------------------

     内核     \      /

              信号量

  也就是说,信号量是由内核来维护的,他独立出进程。因此可以通过它来进行同步。

  上图一般来说,是基于Posix有名信号量,可以认为它是系统中的一个特殊文件(因为在Linux中,一切都可以认为是文件),因为在进程间的通信、同步中用的比较多,如果是线程之间

的同步,经常用基于Posix内存的信号量。(基于内存的信号量必须在创建时指定是否在进程间共享,有名信号量随内核有持续性,需手工删除,而基于内存的信号量具有随进程的持续性)

  对于信号量的工作原理,其实和互斥锁+条件变量相似。

  主要函数有:sem_open、sem_close、sem_unlink,这里要注意,close只是关闭信号量,但并未从系统中删除,而unlink是删除该信号量。

  sem_wait和sem_trywait函数,他们和pthread_cond_wait功能相似,都是等待某个条件的成立,sem_wait和sem_trywait的区别是,当所指定的信号量的值为0时,后者并不将调用者投入

睡眠,而是立刻返回EAGAIN,即重试。

  sem_post和sem_getvalue函数,sem_post将指定的信号量加一,然后唤醒正在等待该信号量值变为正数的任意线程。sem_getvalue是用来获取当前信号量值的函数。

 

四 管道


原创粉丝点击