POSIX信号量机制是3种IPC机制之一,3种IPC机制源于POSIX.1的实时扩展。

创建一个新的命名信号量或者使用一个现有信号量

#include <fcntl.h>
#include <sys/stat.h>
#include <semaphore.h> sem_t *sem_open(const char *name, int oflag);
sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value);
Link with -pthread
返回值:成功指向信号量的指针,出错SEM_FAILED
name:信号灯外部名字
oflag:选择创建或打开一个现有的信号灯
mode:权限位
value:信号灯初始值

当完成信号量操作时,可以调用sem_close函数来释放任何信号量相关的资源

#include <semaphore.h>

int sem_close(sem_t *sem);
返回值:成功0,出错-
Link with -pthread
sem:指向信号量的指针

可以使用sem_unlink函数来销毁一个命名信号量

#include <semaphore.h>

int sem_unlink(const char *name);
返回值:成功0,出错-
Link with -pthread
name:信号灯的外部名字

实现信号量的减1操作

#incldue <semaphore.h>

int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
返回值:成功0,出错-
sem:指向信号灯的指针

还有一个阻塞一段确定的时间来减1操作

#include <semaphore.h>
#include <time.h> int sem_timedwait(sem_t *restrict sem, const struct timespec *abs_timeout);
返回值:成功0,出错-
Link with -pthread
sem:指向信号灯的指针
abs_timeout:绝对时间。超时基于CLOCK_REALTIME时钟的

使信号量值增1

#include <semaphore.h>

int sem_post(sem_t *sem);
返回值:成功0,出错-
Link with -pthread
sem:指向信号灯的指针

创建一个未命名的信号量

#incldue <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);
返回值:成功0,出错-
sem:指向信号灯的指针
pshared:表明是否在多个进程中使用信号量,如果是,设置成一个非0值
value:信号量的初始值

对未命名信号量的使用已经完成时,可以丢弃它

#include <semaphore.h>

int sem_destroy(sem_t *sem);
返回值:成功0,出错-
sem:指向信号灯的指针

可以用来检索信号量值

#include <semaphore.h>

int sem_getvalue(sem_t *sem, int *sval);
返回值:成功0,出错-
sem:指向信号灯的指针
sval:指向的整数值将包含信号量值。除非使用额外的同步机制来避免这种竞争,否则sem_getvalue函数只能用于调试

例程1:

建立两个线程,这两个线程各自将自己的一个整型变量i从1递增到100,并通过信号量控制递增的过程,即这两个整型变量的差不能超过5。

 lude <stdio.h>
#include <semaphore.h>
#include <pthread.h> #define MAX 100
sem_t sem1, sem2; void *th_fn1(void *arg)
{
int i;
for(i=;i<MAX;i++)
{
sem_wait(&sem1);
printf("number in thread1 is %d\n", i);
sem_post(&sem2);
}
pthread_exit((void *)"thread1 exit\n");
} void *th_fn2(void *arg)
{
int i;
for(i=;i<MAX;i++)
{
sem_wait(&sem2);
printf("number in thread2 is %d\n", i);
sem_post(&sem1);
}
pthread_exit((void *)"thread2 exit\n");
} int main(int argc, char *argv[])
{
pthread_t tid1, tid2;
void *tret;
if(sem_init(&sem1, , ) == -)
{
perror("sem1 init failed\n");
return -;
}
if(sem_init(&sem2, , ) == -)
{
perror("sem2 init failed\n");
return -;
} pthread_create(&tid1, NULL, th_fn1, NULL);
pthread_create(&tid2, NULL, th_fn2, NULL); pthread_join(tid1, &tret);
pthread_join(tid2, &tret); sem_destroy(&sem1);
sem_destroy(&sem2); return ;
}

thread sem

linux POSIX信号量的更多相关文章

  1. linux POSIX 信号量介绍

    信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)使用.多线程可以同时运行多个线程函数完成功能,但是对于共享数据如果不加以锁定,随意改变共享数据的值会发生 ...

  2. linux Posix 信号量 一

    信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语. linux提供两种信号量,“内核信号量”和“用户态进程信号量”,“用户态信号量”又分为“Posix”,“System V”信号 ...

  3. linux Posix 信号量 二

    一.Posix信号量 1.Posix信号量分为两种: 1.   有名信号量:使用Posix IPC名字标识(有名信号量总是既可用于线程间的同步,又可以用于进程间的同步) 2.   内存信号量:存放在共 ...

  4. linux Posix 信号量 三 (经典例子)

    本文将阐述一下信号量的作用及经典例子,当中包括“<越狱>寄信”,“家庭吃水果”,“五子棋”,“接力赛跑”,“读者写者”,“四方恋爱”等 首先,讲 semWait操作(P操作)和semSig ...

  5. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  6. Linux进程同步之POSIX信号量

    POSIX信号量是属于POSIX标准系统接口定义的实时扩展部分.在SUS(Single UNIX Specification)单一规范中,定义的XSI IPC中也同样定义了人们通常称为System V ...

  7. Linux多线程实践(5) --Posix信号量与互斥量解决生产者消费者问题

    Posix信号量 Posix 信号量 有名信号量 无名信号量 sem_open sem_init sem_close sem_destroy sem_unlink sem_wait sem_post ...

  8. linux c编程:Posix信号量

    POSIX信号量接口,意在解决XSI信号量接口的几个不足之处: POSIX信号量接口相比于XSI信号量接口,允许更高性能的实现. POSIX信号量接口简单易用:没有信号量集,其中一些接口模仿了我们熟悉 ...

  9. linux网络编程之posix信号量与互斥锁

    继上次学习了posix线程之后,这次来讨论一下posix信号量与互斥锁相关的知识: 跟posix消息队列,共享内存的打开,关闭,删除操作一样,不过,上面的函数是对有名信号量进行操作,通过man帮助可以 ...

随机推荐

  1. linux部署jdk-tomcat

    http://blog.csdn.net/u012187452/article/details/72595040 //参考jdk下载 一.安装JDK1 下载安装包http://blog.csdn.ne ...

  2. 【JS】JS以及CSS对页面的阻塞

    一.JS阻塞 所有的浏览器在下载JS文件的时候,会阻塞页面上的其他活动,包括其他资源的下载以及页面内容的呈现等等,只有当JS下载.解析.执行完,才会进行后面的 操作.在现代的浏览器中CSS资源和图片i ...

  3. 【纪中集训】2019.08.10【NOIP提高组】模拟 A 组TJ

    T1 Description Solution 有待填坑-- T2 Description 给定一个\(h(≤10)\)层.\(n(≤10)\)行.\(m(≤10)\)列的由泥土组成的立方体,挖开\( ...

  4. Ceph中PG和PGP的区别

    http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/ 一.前言 首先来一 ...

  5. mysql的安裝

    记得上学的时候,“研究”过一次mysql,找了篇文章,在课堂上念了.至今已经10余年,居然没再碰过数据库,自以为做嵌入式不用数据库,回头一看,却已经out许久... 上网下到最新的mysql5.5,从 ...

  6. css text文本

    CSS 文本格式 文本格式 This text is styled with some of the text formatting properties. The heading uses the ...

  7. SPOJ LEXSTR 并查集

    题目描述: Taplu and Abhishar loved playing scrabble. One day they thought of inventing a new game using ...

  8. inline-block空隙怎么解决

    方法一:移除空格 元素间留白间距出现的原因就是标签段之间的空格,因此,去掉HTML中的空格,自然间距就木有了.考虑到代码可读性,显然连成一行的写法是不可取的,我们可以: <div class=& ...

  9. django中初学常犯错误之梳理

    一,关于setting设置,1,两个INSRALLEN_APPS,需要将新建的app添加进去 2,需要再setting将html的路径拼接起来 二,urls.py 设置,from app名 impor ...

  10. [STemWin教程入门篇] 第一期:emWin介绍

    转自:http://bbs.armfly.com/read.php?tid=1544 SEGGER公司介绍 了解emWin之前,先了解一下SEGGER这家公司,了解生产商才能对emWin有更加全面的认 ...