首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的代码中添加信号量重试登录

在我的代码中添加信号量重试登录
EN

Stack Overflow用户
提问于 2015-07-28 17:45:38
回答 1查看 126关注 0票数 0

当前场景

我有一个二进制信号量,在我获取信号量锁(它的非阻塞信号量)之前,我正在对一个变量做一些操作,如果其他进程或线程想要获取它,它将失败,并显示信号量超时。

想要实现

一个重试机制,其中如果信号量锁由于超时而失败,它将调用我的重试机制,我计划在锁失败的情况下重试,延迟1秒,重试5次。

我的问题是信号量锁返回什么,下面是我的方法

代码语言:javascript
复制
errorhandl semretry(){
    int count =5;
    errorhandl err = NULL;
    do{
        err = semaphore.lock(); // <<< to me it looks that err will always be NULL
        if(semaphore.timeout()) {
            sleep (1);
            count --;
        }
    }while(count > 0);
}

关于这种方法的任何建议。我想在获取或不获取锁的基础上做更多的工作。请建议还可以做些什么。

EN

回答 1

Stack Overflow用户

发布于 2015-07-28 19:45:32

您可以尝试使用以下两种实现中的任何一种。我建议你选第二个。

代码语言:javascript
复制
int semretry(sem_t *sem)
{
    int count =5;
    int err;
    do{
        err = sem_trywait(sem);
        if(errno == EAGAIN) {
            err = EAGAIN;
            sleep(1);
            count --;
        } else {
            return 0;
        }
    }while(count > 0);
    return err;
}

int semretry(sem_t *sem)
{
    int count =5;
    int err;
    struct timespec timeout;
    do{
        clock_gettime(CLOCK_REALTIME, &timeout);
        timeout.tv_sec += 1;
        err = sem_timedwait(sem, &timeout);
        if(err != 0) {
            err = EAGAIN;
            count --;
        } else {
            return 0;
        }
    }while(count > 0);
    return err;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31672756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档