当前场景
我有一个二进制信号量,在我获取信号量锁(它的非阻塞信号量)之前,我正在对一个变量做一些操作,如果其他进程或线程想要获取它,它将失败,并显示信号量超时。
想要实现
一个重试机制,其中如果信号量锁由于超时而失败,它将调用我的重试机制,我计划在锁失败的情况下重试,延迟1秒,重试5次。
我的问题是信号量锁返回什么,下面是我的方法
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);
}关于这种方法的任何建议。我想在获取或不获取锁的基础上做更多的工作。请建议还可以做些什么。
发布于 2015-07-28 19:45:32
您可以尝试使用以下两种实现中的任何一种。我建议你选第二个。
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;
}https://stackoverflow.com/questions/31672756
复制相似问题