我是靠谱客的博主 美满芒果,最近开发中收集的这篇文章主要介绍信号量 sem_timedwait 函数的使用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


代码示例
    这个例子主要是为了讲解 sem_timedwait 函数的。
#include <stdio.h>
#include <sys/time.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdint.h>

#define TIMEOUT_S 5
#define TIMEOUT_MS 1500

sem_t sem;

// 时间 time 自加 ms 毫秒
void time_add_ms(struct timeval *time, uint ms)
{
        time->tv_usec += ms * 1000; // 微秒 = 毫秒 * 1000
        if(time->tv_usec >= 1000000) // 进位,1000 000 微秒 = 1 秒
        {
                time->tv_sec += time->tv_usec / 1000000;
                time->tv_usec %= 1000000;
        }
}

void *pthread(void *arg)
{
        struct timespec t;

        // 毫秒级别
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        struct timeval time;
        gettimeofday(&time, NULL);
        time_add_ms(&time, TIMEOUT_MS);
        t.tv_sec = time.tv_sec;
        t.tv_nsec = time.tv_usec * 1000;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        // 秒级别
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        //t.tv_sec = time(NULL) + TIMEOUT_S;
        //t.tv_nsec = 0;
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        printf("t.tv_sec = %lun", t.tv_sec);
        printf("t.tv_nsec = %lun", t.tv_nsec);

        while(1)
        {
                int semvalue = -1;
                sem_getvalue(&sem, &semvalue);
                printf("will call sem_timedwait, semvalue = %dn", semvalue);

                // 如果sem 信号量值>0,则sem_timedwait 立即返回;如果sem 信号量值≤0,则 sem_timedwait 阻塞等待 TIMEOUT秒后再返回。
                int ret = sem_timedwait(&sem, &t);
                printf("over call sem_timedwait, ret = %dn", ret);
                if (ret == -1)
                {
                        sem_getvalue(&sem, &semvalue);
                        printf("pthread() will returnn");
                        return NULL;
                }
        }
}

int main(void)
{
        pthread_t tid;

        sem_init(&sem, 0, 0);  // 第3个参数是0,相当于此时停车场已经停满了,必须要等到有车离开时(即执行sem_post 操作)才能停车。
        sem_post(&sem);
        sem_wait(&sem);
        sem_post(&sem);

        pthread_create(&tid, NULL, &pthread, NULL);
        pthread_join(tid, NULL);

        sem_destroy(&sem);

        return 0;
}

编译/执行
xj@ubuntu-server:~/semaphore$ gcc sem_timedwait.c -lpthread
xj@ubuntu-server:~/semaphore$ ./a.out 
t.tv_sec = 1446627450
t.tv_nsec = 79247000
will call sem_timedwait, semvalue = 1
over call sem_timedwait, ret = 0
will call sem_timedwait, semvalue = 0
over call sem_timedwait, ret = -1
pthread() will return


最后

以上就是美满芒果为你收集整理的信号量 sem_timedwait 函数的使用的全部内容,希望文章能够帮你解决信号量 sem_timedwait 函数的使用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部