信号量本质上是一个非负的整数计数器,也是UNIX中古老的实现进程互斥和同步的手段,Linux下信号量概念是在线程中,信号则在进程控制中,不过原理差不多,最基本最经典的操作莫过于P、V操作了,能实现进程、线程的互斥和同步操作,非常值得深入理解。

1.P、V操作原语

P操作:

proceduce P(var s:semaphore)

{

begin

s:=s-1;

if(s<0)then W(s);

end

}

V操作:

proceduce V(var s:semaphore)

{

begin

s:=s+1;

if(s<=0)then R(s);

end

}

2.基本操作

数据类型:信号量的数据类型为结构sem_t,它本质上是一个长整型的数。

函数:

(1)sem_init

功能:         用于创建一个信号量,并初始化信号量的值。

头文件:       <semaphore.h>

函数原型:     int sem_init (sem_t* sem, int pshared, unsigned int value);

函数传入值:   sem:信号量。

pshared:决定信号量能否在几个进程间共享。由于目前LINUX还没有实现进

程间共享信息量,所以这个值只能取0。

value:初始计算器

函数返回值:   0:成功。

-1:失败。

(2)其他函数。

//等待信号量

int sem_wait       (sem_t* sem);

int sem_trywait   (sem_t* sem);

//发送信号量

int sem_post       (sem_t* sem);

//得到信号量值

int sem_getvalue (sem_t* sem);

//删除信号量

int sem_destroy   (sem_t* sem);

功能:sem_wait和sem_trywait相当于P操作,它们都能将信号量的值减一,两者的区别在

于若信号量的值小于零时,sem_wait将会阻塞进程,而sem_trywait则会立即返回。

sem_post相当于V操作,它将信号量的值加一,同时发出唤醒的信号给等待的进程

(或线程)。

sem_getvalue 得到信号量的值。

sem_destroy 摧毁信号量。

函数传入值: sem:信号量。

函数返回值: 同上。

好了,了解完基本操作,继续做一个练习:

这里用信号量实现互斥资源访问的功能:

/*sem.c*/ 
#include <stdlib.h>    
#include <stdio.h>    
#include <pthread.h>    
#include <semaphore.h>  
#include <errno.h>     
 
/*全局变量*/ 
int gnum = 0;  
/*信号量*/ 
sem_t sem;  
/*声明线程运行服务程序*/ 
static void pthread_func_1 (void);     
static void pthread_func_2 (void);     
    
int main (void)     
{     
 /*线程的标识符*/ 
  pthread_t pt_1 = 0;     
  pthread_t pt_2 = 0;     
  int ret = 0;     
 
  /*信号量初始化*/ 
  sem_init(&sem,0,1);  
  /*分别创建线程1、2*/ 
  ret = pthread_create (&pt_1,          //线程标识符指针  
                         NULL,          //默认属性  
                        (void *)pthread_func_1,//运行函数  
                        NULL);          //无参数  
  if (ret != 0)     
  {     
     perror ("pthread_1_create");     
  }     
    
  ret = pthread_create (&pt_2,          //线程标识符指针  
                        NULL,           //默认属性    
                        (void *)pthread_func_2, //运行函数  
                        NULL);          //无参数  
  if (ret != 0)     
  {     
     perror ("pthread_2_create");     
  }     
  /*等待线程1、2的结束*/ 
  pthread_join (pt_1, NULL);     
  pthread_join (pt_2, NULL);     
    
  printf ("main programme exit!/n");    
  return 0;     
}     
 
/*线程1的服务程序*/ 
static void pthread_func_1 (void)     
{     
  int i = 0;     
       
  for (;;)     
  {     
    printf ("This is pthread1!/n");      
    sem_wait(&sem);     /*等待信号量*/     
    sleep (1);   
    /*临界资源*/ 
    gnum++;  
    printf ("Thread1 add one to num:%d/n",gnum);  
      
    sem_post (&sem);        /*释放信号量*/ 
 
 
       
  }     
}     
/*线程2的服务程序*/   
static void pthread_func_2 (void)     
{     
  int i = 0;     
    
  for (;;)     
  {     
    printf ("This is pthread2!/n");   
    sem_wait(&sem);     /*等待信号量*/ 
    sleep (1);  
    /*临界资源*/ 
    gnum++;  
    printf ("Thread2 add one to num:%d/n",gnum);  
      
    sem_post (&sem);        /*释放信号量*/ 
    
  }     
    
  pthread_exit (0);     
}

编译,运行,可以看出和上次互斥锁结果一样的

linux多线程编程5--信号量(semaphore)相关推荐

  1. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

  2. linux 多线程 semaphore ,Linux下多线程编程-Pthread和Semaphore使用.doc

    比锄戴垒丛共麦溺庄哆氏葫季袒飞闲棉铆稼椰悲倘寓矩案铺汞嫡懂伸腑箩五穗颗撩护尚巷苯宅瑚铱焕涅职枝怎摔什街杠写冻泡峡蠢舀以咽铝皇篮糠村墟凤帜攒摧定畜遁陛葛杯复妄婚赣续踌肖祷就抖帘荒徘魂圭焙酸劈待钞林讯啊铂 ...

  3. Linux多线程的同步-----信号量和互斥锁

    前面两篇给基本概念讲过了,大家有兴趣的可以去看一下: Linux多线程_神厨小福贵!的博客-CSDN博客进程和线程的区别有哪些呢?进程是资源分配的最小单位,线程是CPU调度的最小单位进程有自己的独立地 ...

  4. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程

    为什么线程同步的时候pthread_cond_t要和pthread_mutex_t同时使用 (2009-10-27 11:07:23) 转载▼ 标签: 杂谈 分类: 计算机 举一个例子(http:// ...

  5. Linux 多线程编程(实现生产者消费者模型)

    Linux 多线程编程 线程分类 线程按照其调度者可以分为用户级线程和内核级线程两种. 内核级线程 在一个系统上实现线程模型的方式有好几种,因内核和用户空间提供的支持而有一定程度的级别差异.最简单的模 ...

  6. Linux多线程编程-互斥锁

    互斥锁 多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量.POSIX互斥锁相关函数主要有以下5个: #include <p ...

  7. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  8. linux线程 ppt,Linux多线程编程多核编程.ppt

    <Linux多线程编程多核编程.ppt>由会员分享,可在线阅读,更多相关<Linux多线程编程多核编程.ppt(28页珍藏版)>请在装配图网上搜索. 1.Linux多线程编程, ...

  9. 多核程序设计 linux,多核程序设计Linux多线程编程.ppt

    Linux多线程编程,IEEE POSIX 标准 p1003.1c (Pthreads) 定义了处理线程的一系列C 语言类型的API. 在Linux中,线程一般被认为是"轻量级的进程&quo ...

  10. c/c++ Linux多线程编程

    Linux多线程编程 线程概念 线程是指运行中的程序的调度单位.一个线程指的是进程中一个单一顺序的控制流,也被称为轻量级线程.它是系统独立调度和分配的基本单位.同一进程中的多个线程将共享该系统中的全部 ...

最新文章

  1. NASA发现超级地球,真的适宜居住?
  2. android从放弃到精通 第九天 勿忘初心
  3. python具体有什么用-python是什么意思?python有什么用?
  4. python list去掉引号_最新的python面试题集170之三(基础性学习)
  5. org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for
  6. ubuntu11.10安装arm-linux-gcc详解
  7. 嘉益仕(Litns)带您读懂MES系统:选型篇
  8. 《自然》年度十大人物:天才曹原居首 贺建奎来去匆匆
  9. 盘点Greenplum 6.0六大新特性及展望
  10. OpenStack是什么?
  11. C#.NET 大型通用信息化系统集成快速开发平台 4.6 版本 - SSO单点登录接口
  12. spring页面使用注解@RequestParam把请求参数封装到map中
  13. C语言入门基础知识有哪些?
  14. [LeetCode]41.First Missing Positive
  15. 适配器模式 - 上厕所案例
  16. [渝粤教育] 西南科技大学 翻译 在线考试复习资料
  17. CNN中的小tips
  18. 论文阅读:Overview of the NLPCC 2018 Shared Task: Grammatical Error Correction
  19. [数据可视化] 环形图(Donut Chart)
  20. 宁波跨境海关商品订单推送清关及支付宝海关报关

热门文章

  1. object转字符串
  2. linux shmget shmctl
  3. NLP数据挖掘基础知识
  4. SVG技术入门:线条动画实现原理
  5. gcc g++ Linux下动态库_静态库
  6. 【转】Direct3D顶点结构使用总结
  7. 恢复快速启动栏里的“显示桌面”图标
  8. vue2使用axios post跳坑,封装成模块
  9. [转]Tomcat中8005/8009/8080/8443端口的作用
  10. bugku_本地包含