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. iview select下拉框的蜜汁小坑

    前言 最近使用iview的select下拉选择器,遇到一个很神奇的问题:选中下拉框里面的一个值,但是再去点下拉框的时候就只剩刚才选中的数据了.感觉应该是插件把刚才选中的数据当做的搜索条件,所以需要做的 ...

  2. 在 IntelliJ IDEA 中这样使用 Git,效率提升2倍以上

    1.Git简介 Git是目前流行的分布式版本管理系统.它拥有两套版本库,本地库和远程库,在不进行合并和删除之类的操作时这两套版本库互不影响.也因此其近乎所有的操作都是本地执行,所以在断网的情况下任然可 ...

  3. Vue学习笔记【31】——Vue路由(computed计算属性的使用)

    computed计算属性的使用 默认只有getter的计算属性:  <div id="app">    <input type="text" ...

  4. linux基础(六)

    今天我们来看一下Samba服务和nginx服务. Samba服务 1.samba的功能 samba是一个网络服务器,用于Linux和Windows之间共享文件. 2.samba服务的启动.停止.重启  ...

  5. POJ 3279 Fliptile (dfs+二进制)

    Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more ...

  6. mysql学习-join的使用

    sql的执行顺序是从from 开始 join图

  7. mysql5.6和5.7安装 centos

    mysql5.7安装 tar xf mysql--linux-glibc2.-x86_64.tar.gz mv mysql--linux-glibc2.-x86_64 /opt/mysql yum i ...

  8. Windows 08R2_破解管理员密码

    目录 目录 破解Windows 08R2管理员密码 破解Windows 08R2管理员密码 将登录界面的功能链接变成cmd.exe的链接,通过CMD进入到目录C:\Windows\System32下, ...

  9. 购买 Linux VPS 服务器后简单的安全设置

    我们在购买了 Linux 系统的 VPS 或服务器后,一般的商家都会给你一个 root 权限的账号,并且默认的密码不会太长,这是很不安全的.经常有客户因为弱口令而被黑客暴力破解密码导致 VPS 服务器 ...

  10. Jeecg_Jflow整合记录

    系统组织机构 t_s_deparselect * from t_s_departselect * from t_s_depart where id='402888fd6a8c24e9016a8c531 ...