博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SIGIO 异步通知转换为同步阻塞
阅读量:4059 次
发布时间:2019-05-25

本文共 2362 字,大约阅读时间需要 7 分钟。

#include <stdio.h>
#include <pthread.h>
#include <signal.h>
pthread_t tid1,tid2,tid_sig;
pthread_cond_t cond1,cond2;
pthread_mutex_t mutex1,mutex2;
unsigned int flag1,flag2;
unsigned long thread1_sig_counter=0;
unsigned long thread2_sig_counter=0;
void *thread1_func(void *arg)
{
    sigset_t sigset;
    //block SIGRTMIN
    sigemptyset(&sigset);
    sigaddset(&sigset,SIGRTMIN);
    pthread_sigmask(SIG_SETMASK,&sigset,NULL);
    while(1)
    {
        pthread_mutex_lock(&mutex1);
        while(!flag1)
        {
            pthread_cond_wait(&cond1,&mutex1);
        }
        printf("thread1_func got signal! CNT=%ld\n",thread1_sig_counter++);
        //reset.
        flag1=0;
        pthread_mutex_unlock(&mutex1);
    }
}
void *thread2_func(void *arg)
{
    sigset_t sigset;
    //block SIGRTMIN
    sigemptyset(&sigset);
    sigaddset(&sigset,SIGRTMIN);
    pthread_sigmask(SIG_SETMASK,&sigset,NULL);
    while(1)
    {
        pthread_mutex_lock(&mutex2);
        while(!flag2)
        {
            pthread_cond_wait(&cond2,&mutex2);
        }
        printf("thread2_func got signal! CNT=%ld\n",thread2_sig_counter++);
        //reset.
        flag2=0;
        pthread_mutex_unlock(&mutex2);
    }
}
void *thread_signal(void *arg)
{
    int ret;
    sigset_t sigset;
    sigemptyset(&sigset);
    sigaddset(&sigset,SIGRTMIN);
    while(1)
    {
        printf("thread signal:wait signal...\n");
        if(0==sigwait(&sigset,&ret))
        {
            if(SIGRTMIN==ret)
            {
                printf("trigger thread1!\n");
                //trigger thread1.
                pthread_mutex_lock(&mutex1);
                flag1=1;
                pthread_cond_signal(&cond1);
                pthread_mutex_unlock(&mutex1);
                printf("trigger thread2!\n");
                //trigger thread1.
                pthread_mutex_lock(&mutex2);
                flag2=1;
                pthread_cond_signal(&cond2);
                pthread_mutex_unlock(&mutex2);
            }
        }
    }
}
//main process.
int main(void)
{
    sigset_t sigset;
    pthread_mutex_init(&mutex1,NULL);
    pthread_mutex_init(&mutex2,NULL);
    pthread_cond_init(&cond1,NULL);
    pthread_cond_init(&cond2,NULL);
    flag1=flag2=0;
    //block SIGRTMIN
    sigemptyset(&sigset);
    sigaddset(&sigset,SIGRTMIN);
    pthread_sigmask(SIG_SETMASK,&sigset,NULL);
    if(pthread_create(&tid1,NULL,thread1_func,NULL))
    {
        printf("create thread1 failed!\n");
        return -1;
    }
    if(pthread_create(&tid2,NULL,thread2_func,NULL))
    {
        printf("create thread2 failed!\n");
        return -1;
    }
    if(pthread_create(&tid_sig,NULL,thread_signal,NULL))
    {
        printf("create signal thread failed!\n");
        return -1;
    }
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    pthread_join(tid_sig,NULL);
    pthread_cond_destroy(&cond1);
    pthread_cond_destroy(&cond2);
    pthread_mutex_destroy(&mutex1);
    pthread_mutex_destroy(&mutex2);
    printf("done!\n");
    return 0;
}

转载地址:http://lwzji.baihongyu.com/

你可能感兴趣的文章
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
course_2_assessment_6
查看>>
coursesa课程 Python 3 programming course_2_assessment_7 多参数函数练习题
查看>>
coursesa课程 Python 3 programming course_2_assessment_8 sorted练习题
查看>>
在unity中建立最小的shader(Minimal Shader)
查看>>
1.3 Debugging of Shaders (调试着色器)
查看>>
关于phpcms中模块_tag.class.php中的pc_tag()方法的含义
查看>>
linux安装usb wifi接收器
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
socket编程中select的使用
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>