Linux使用信号量同步请求、应答线程

2017-01-05 20:14:32来源:CSDN作者:weirancg人点击

/************************************************** 本实例演示了两个线程,通过信号量进行同步,** 这种方法简化了软件处理流程,可以用于请求应答机制。************************************************/#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <errno.h>#include <sys/ipc.h>#include <semaphore.h>int lock_var;sem_t sem;/*void event_thread(void *arg){       while(1)    {        printf("event_thread send req, wait ack.../n");//发送请求        sem_wait(&sem);//等待信号量,线程阻塞在这里        printf("event_thread got ack!!!/n/n");//线程继续进行    }}*/void event_thread(void *arg){       while(1)    {        printf("event_thread send req, wait ack.../n");//发送请求        struct timespec ts;        if ( clock_gettime( CLOCK_REALTIME, &ts ) < 0 )        {            return;        }        //ts.tv_sec=time(NULL)+3;           ts.tv_sec += 3;        int ret = sem_timedwait(&sem, &ts);//等待信号量,线程阻塞在这里,如果等待超时,则继续向后执行        if(ret == -1)        {            printf("event_thread wait timeout!!!/n/n");//等待信号量超时,但线程继续进行        }        else        {            printf("event_thread got ack!!!/n/n");//获得信号量,线程继续进行        }    }}void io_thread(void *arg){    while(1)    {        sleep(4);        printf("io_thread got ack/n");//收到响应        sem_post(&sem);//发送信号量        printf("io_thread post sem/n");    }}//两个线程,一个事务线程,一个IO线程int main(int argc, char *argv[]){    pthread_t id1, id2;    pthread_t mon_th_id;    int ret;    ret = sem_init(&sem, 0, 0);    if(ret != 0)    {        perror("sem_init");    }    ret = pthread_create(&id1, NULL, (void *)event_thread, NULL);    if(ret != 0)    {        perror("pthread cread1");    }    ret = pthread_create(&id2, NULL, (void *)io_thread, NULL);    if(ret != 0)    {        perror("pthread cread2");    }    pthread_join(id1, NULL);    pthread_join(id2, NULL);    exit(0);}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台