线程间通讯的信号量semaphore.h

2023-05-16

 sem_init 

SEM_INIT(3)                                                                               Linux Programmer's Manual                                                                              SEM_INIT(3)

NAME
       sem_init - initialize an unnamed semaphore

SYNOPSIS
       #include <semaphore.h>

       int sem_init(sem_t *sem, int pshared, unsigned int value);

       Link with -pthread.

 sem_wait

NAME
       sem_wait, sem_timedwait, sem_trywait - lock a semaphore

SYNOPSIS
       #include <semaphore.h>

       int sem_wait(sem_t *sem);

       int sem_trywait(sem_t *sem);

       int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);

       Link with -pthread.

   Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       sem_timedwait(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
            struct timespec {
               time_t tv_sec;      /* Seconds */
               long   tv_nsec;     /* Nanoseconds [0 .. 999999999] */
           };

sem_post 函数 

NAME
       sem_post - unlock a semaphore

SYNOPSIS
       #include <semaphore.h>

       int sem_post(sem_t *sem);

       Link with -pthread.

综合测试代码 

测试代码:

验证项目:

1 signal是进程级别的

2 sem_t和发送和等待

3 线程传递结构体参数

4 发送一个signal

5 线程的分离

#include <stdio.h>
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <semaphore.h>
#include <signal.h>
#include <map>

#define DEBUG_INFO(format, ...) printf("%s:%d -- " format "\n", __func__, __LINE__,##__VA_ARGS__)

typedef void (*sighandler)(int signo);
std::map<pthread_t ,std::string> thread_map;
void sig_func(int signo) {
    switch(signo) {
        case SIGUSR1:
            DEBUG_INFO("SIGUSR1 signal %u,%lu",getpid(),pthread_self());
            std::cout << __func__ << " " << thread_map[pthread_self()] << std::endl;
            break;
        default:
            DEBUG_INFO("unkonwn signo = %d\n", signo);
            break;
    }
}

struct mystruct{
    pthread_t thread_id;
    sem_t sem;
    char buf[1024];
    int fd;
    int socket;
    int arg1;
    int arg2;
};

void* func(void *arg){
    struct mystruct *pms = (struct mystruct*)arg;
    pthread_detach(pthread_self());
    signal(SIGUSR1,sig_func);
    DEBUG_INFO("pthread_self = %lu\n", pthread_self());
    DEBUG_INFO("wait a semaphore");
    sem_wait(&pms->sem);
    std::cout << thread_map[pthread_self()] << std::endl;
    DEBUG_INFO("get a semaphore thread_id = %lu",pms->thread_id);
    DEBUG_INFO("thread pid = %u",getpid());
    while(1){
        //process(fd)
        //process(socket)
        usleep(1);
    }
}

int main(int argc, char **argv){
    std::cout << "Usage: " << argv[0] << std::endl;
    DEBUG_INFO("main pid = %u",getpid());
    DEBUG_INFO("%ld",sizeof(pthread_t));
    DEBUG_INFO("main thread = %lu\n", pthread_self());
    thread_map[pthread_self()] = std::string("main thread");
    std::cout << __func__ << " " << thread_map[pthread_self()] << std::endl;
    for(int i = 0; i < 3;i++){
        struct mystruct *pms = (struct mystruct*)malloc(sizeof(struct mystruct));
        
        if(pms == NULL){
            perror("malloc");
            exit(-1);
        }
        sem_init(&pms->sem,0,0);
        pthread_t t;
        int ret = pthread_create(&t,NULL,func,pms);
        if(ret != 0){
            perror("pthread_create");
            exit(1);
        }
        thread_map[pthread_self()] = std::string("child thread:") + std::to_string(i);
        pms->thread_id = t;
        sleep(1);
        sem_post(&pms->sem);
    }
    kill(getpid(),SIGUSR1);
    kill(getpid(),SIGUSR1);
    kill(getpid(),SIGUSR1);
    kill(getpid(),SIGUSR1);
    kill(getpid(),SIGUSR1);
    while(1){
        sleep(1);
    }
    DEBUG_INFO("bye bye");
    return 0;
}

执行结果:

main:55 -- main pid = 24855
main:56 -- 8
main:57 -- main thread = 139649254037312

main main thread
func:40 -- pthread_self = 139649236711168

func:41 -- wait a semaphore

func:44 -- get a semaphore thread_id = 139649236711168
func:45 -- thread pid = 24855
func:40 -- pthread_self = 139649228318464

func:41 -- wait a semaphore

func:44 -- get a semaphore thread_id = 139649228318464
func:45 -- thread pid = 24855
func:40 -- pthread_self = 139649219925760

func:41 -- wait a semaphore
sig_func:17 -- SIGUSR1 signal 24855,139649254037312
sig_func child thread:2
sig_func:17 -- SIGUSR1 signal 24855,139649254037312
sig_func child thread:2
sig_func:17 -- SIGUSR1 signal 24855,139649254037312

func:44 -- get a semaphore thread_id = 139649219925760
func:45 -- thread pid = 24855
sig_func child thread:2
sig_func:17 -- SIGUSR1 signal 24855,139649254037312
sig_func child thread:2
sig_func:17 -- SIGUSR1 signal 24855,139649254037312
sig_func child thread:2

小结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程间通讯的信号量semaphore.h 的相关文章

随机推荐

  • sklearn2pmml xgboost缺失值(missing)处理的坑

    sklearn2pmml xgboost缺失值 missing 处理的坑 今天同事在部署xgboost pmml模型时遇到了大坑 xff0c 线上spark预测和本地python预测结果怎么都不对应 xff0c 记录一下处理过程 看了下同事
  • adb导出手机应用到电脑

    简单说一下相关步骤 xff0c 以备不时之需 1 手机开启usb调试 2 Windows系统 Win 43 R打开命令行窗口 xff0c 输入adb devices xff0c 如果连接成功会出现机子的序列号 3 adb shell pm
  • Js作用域与作用域链详解

    一直对Js的作用域有点迷糊 xff0c 今天偶然读到Javascript权威指南 xff0c 立马被吸引住了 xff0c 写的真不错 我看的是第六版本 xff0c 相当的厚 xff0c 大概1000多页 xff0c Js博大精深 xff0c
  • windows10环境下tensorflow安装教程

    楼主最近一直忙着找工作 最近几个月一直all in java 好久没学机器学习 深度学习 前几天突然通知要提交论文中期了 于是赶紧打开电脑 结果发现之前安装的tensorflow居然登陆不上了 折腾了半天 搜过各种csdn博客 一直安装失败
  • 'gbk' codec can't encode character '\xa0'

    从网上抓了一些字节流 xff0c 想打印出来结果发生了一下错误 xff1a UnicodeEncodeError 39 gbk 39 codec can 39 t encode character 39 xbb 39 in position
  • 【Git记录学习】github创建项目以及本地使用(vscode)

    一 github创建空仓库 从github中创建空仓库 在执行完上一步操作后会返回这样的界面 xff0c 包括了一些基本的git操作以及HttpS SSH地址 生成一个readme md文档 xff08 步骤2 Set up下面有蓝色的超链
  • 关于DFT变换含义、公式和具体形式

    原文地址 xff1a http blog sina com cn s blog 7853c3910102v9wd html 这篇文章从实际工程应用的角度 xff0c 记录一下如何计算 xff0c 关于公式 变形和应用 维基百科上的 DFT公
  • 1602显示数字不稳定一直跳动(AD转换)

    程序如下所示 首先说明下 xff0c 此程序为AD转换芯片PCF8591采集电压数据 xff0c 然后送到1602显示 现象 xff1a 1602显示的数字一直频繁的跳动 xff0c 乱花眼 此现象不是一直出现的 xff0c 有时候会出现
  • C++11中的线程类

    前面介绍的线程是利用了POSIX线程库 xff0c 这是传统C C 43 43 程序员使用线程的方式 xff0c 而C 43 43 11提供了语言层面使用线程的方式 C 43 43 11新标准中引入了5个头文件来支持多线程编程 xff0c
  • 4.4.1内核编译

    内核源码下载地址 xff1a https mirrors edge kernel org pub linux kernel v4 x linux 4 4 1 tar gz 安装依赖包 xff1a 报错就装 cp boot config xx
  • fatal error: hugetlbfs.h: No such file or directory

    fatal error hugetlbfs h No such file or directory 解决办法 xff1a sudo apt get update sudo apt get install libhugetlbfs dev
  • WSL下 配置NFS-失败

    配置一个IP地址 xff1a sudo ip addr add 192 168 250 2 24 broadcast 192 168 250 255 dev eth2 sudo apt get install nfs kernel serv
  • OMT 对象模型、动态模型和功能模型

    对象模型描述系统中对象的静态结构 对象之间的关系 对象的属性 对象的操作 对象模型表示静态的 结构上的 系统的 数据 34 特征 对象模型为动态模型和功能模型提供了基本的框架 xff0c 对象模型用包含对象和类的对象图来表示 OMT的对象模
  • 关于epoll的调试的几个问题

    将今天调试的几个小问题点总结下 xff0c 后续遇到再添加 一 将总结的问题点放在最前面 1 epoll wait的maxevents参数 epoll wait的maxevents参数 xff0c 经过测试 xff0c maxevents的
  • poll函数测试

    一 基础知识 include lt poll h gt int poll struct pollfd fds nfds t nfds int timeout 其中参数fds指向一个结构体数组的第0个元素的指针 xff0c 每个数组元素都是一
  • IPC:匿名管道和命名管道

    一 管道初级测试 写两个小程序 xff0c 一个负责向管道发数据 xff0c 一个从管道接收数据 xff1b pipe cpp include lt iostream gt using namespace std int main cout
  • IPC:system V消息队列

    ftok函数 ftok convert a pathname and a project identifier to a System V IPC key SYNOPSIS include lt sys types h gt include
  • IPC:system V 信号量和共享内存

    信号量相关知识 结构体 union semun int val Value for SETVAL struct semid ds buf Buffer for IPC STAT IPC SET unsigned short array Ar
  • 信号signal编程测试

    信号会打断系统调用 xff0c 慎用 xff0c 就是用的时候测一测 下面是信号的基础测试 信号 信号 xff08 signal xff09 机制是UNIX系统中最为古老的进程之间的通信机制 它用于在一个或多个进程之间传递异步信号 信号可以
  • 线程间通讯的信号量semaphore.h

    sem init SEM INIT 3 Linux Programmer 39 s Manual SEM INIT 3 NAME sem init initialize an unnamed semaphore SYNOPSIS inclu