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. PHP发送公众号模板消息

    <?php /* * 模板消息发送,电脑端测试时需要手动填写openid * 微信端会自动获取当前openid发送无需填写 */ header("Content-type: text/ ...

  2. 【Flutter学习】事件处理与通知之事件处理

    一,概述 移动应用中一个必不可少的环节就是与用户的交互,在Flutter中提供的手势检测为GestureDetector. Flutter中的手势系统分为二层: 第一层是触摸原事件(指针) Point ...

  3. sql server 基础语法2

    别名,选择,查询,排序,去重,筛选 select * from UserInfo as ui --起别名 select UserName,UserPwd --指定选择的列 from UserInfo ...

  4. CDN技术详解(七)

    动态内容加速服务的实现 随着Web2.0的兴起,产生了动态网页.个性化内容.电子交易数据等内容的加速,这些就涉及了动态内容加速技术. 静态内容的加速,都是对于表现层的加速,对于动态页面等内容的加速,则 ...

  5. %各位大佬的博客.tql

    线性基:https://www.cnblogs.com/ljh2000-jump/p/5869991.html#4219854 数位DP  https://blog.csdn.net/jk211766 ...

  6. php对接极光推送

    首先要明白php对接极光推送要做些什么,极光推送的大致流程是:你的服务器----->极光服务器------>app端.而php要做的就只有我们的服务器到极光服务器这个过程.极光服务器到ap ...

  7. 栈Stack --- 数组实现

    栈最大的一个特点就是先进后出(FILO—First-In/Last-Out). /** * 栈:后进先出 * Created by fred on 2018/7/31. */ public class ...

  8. PouchContainer 容器技术演进助力阿里云原生升级

    点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 作者 | 杨育兵(沈陵) 阿里巴巴高级技术专家 我们从 2016 年开始在集团推广全面的镜像化容器化,今年是集团全面镜像化容器 ...

  9. ACM-ICPC 比赛环境的使用

    ACM-ICPC 现场赛不同的赛站可能比赛环境不同,不过一般都是 Ubuntu 系统.附带的软件可能略有不同,可能会有使用习惯的差异导致效率下降或者无法运行代码,但是在终端下编译运行代码都是相同的.本 ...

  10. [bzoj4589]Hard Nim(FWT快速沃尔什变化+快速幂)

    题面:https://www.lydsy.com/JudgeOnline/problem.php?id=4589 题意 求选恰好n个数,满足每个数都是不大于m的质数,且它们的异或和为0的方案数. 解法 ...