当前位置: 首页 > 面试题库 >

将POSIX信号量的值增加1以上

凌通
2023-03-14
问题内容

我有这个要求,其中我必须将POSIX信号量的值增加1以上。

显然,POSIX规范中没有办法做到这一点。没有类似于sem_getvalue()的sem_setvalue()。我不想仅仅因为这种限制而回到System
V信号灯。

有没有其他方法可以做到这一点?还是我必须走System V方式?

我在GNU / Linux上用C编程。

预先非常感谢。


问题答案:

我有这个要求,其中我必须将POSIX信号量的值增加1以上。是否有其他替代方法可以实现此目的?还是我必须走System V方式?

那么,您真正的问题是什么?如何实现接口不支持的功能?或者如何使用POSIX
创建行为类似于信号量的结构?

如果稍后,在诉诸SysV之类的笨手笨脚之前,您始终可以使用pthread_mutex_t/
pthread_cond_t对实现几乎所有的多线程同步原语,包括信号量。

例如,未经测试:

typedef cool_sem {
    pthread_mutex_t guard;
    pthread_cond_t cond;
    int count;
} cool_sem_t;

void init( cool_sem_t *s )
{
    pthread_mutex_init( &s->guard, 0 );
    pthread_cond_init( &s->cond, 0 );
    s->S = 0;
}

void incr( cool_sem_t *s, unsigned delta )
{
    assert( s );
    pthread_mutex_lock( &s->guard );
    s->S += delta;
    pthread_cond_broadcast( &s->cond );
    pthread_mutex_unlock( &s->guard );
}

void decr( cool_sem_t *s, unsigned delta )
{
    assert( s );
    pthread_mutex_lock( &s->guard );
    do {
        if (s->S >= delta) {
            s->S -= delta;
            break;
        }
        pthread_cond_wait( &s->cond, &s->guard );
    } while (1);
    pthread_mutex_unlock( &s->guard );
}


 类似资料:
  • 头文件 semaphore.h sys/stat.h fcntl.h 常用函数 函数 说明 [[sem_open sem_open]] 打开一个有名信号量 [[sem_close sem_close]] 关闭一个信号量 [[sem_unlink sem_unlink]] 删除一个信号量 [[sem_post sem_post]] 【V操作】释放操作:信号量的值加1 [[sem_wait sem_w

  • 我有多个进程与Sempahore同步。我知道这段代码不允许gurantee出现这样的情况:在sem_getvalue期间,即使值变为零,甚至在调用特定进程中的sem_post之前,anotehr进程也可能调用sem_post,使值变为2。如何解决这种情况。 我的问题不能通过互斥体来解决,在我的问题中,有些进程只用于信号,即操作,而在互斥体中,所有进程都将等待并不断地发出信号

  • 导出const ProductCard=({product})=>{const{deleteProduct,addToCart}=useContext(ProductContext) }

  • 它编译得很好,但是当我试图运行它时,当它到达部分时,我得到了一个分段错误。我在其他地方读到过,不应该创建指向信号量的指针,但是当我没有创建并尝试时,我遇到了一个关于需要lvalue的错误。任何帮助都将不胜感激。

  •  提示: 任务通知在某些情况下可以提供一个轻量的选择用以替代二值信号量,详见:任务通知  二值信号量(Binary Semaphores)通常用来实现互斥、同步。二值信号量与互斥量虽然相似,但是互斥量拥有优先级继承的特性,而二值信号量没有。这使得二值信号量更加合适去实现同步,互斥量更加适合去实现互斥。 信号量可以设置阻塞时间,当任务试图获取一个暂时不可用的信号量的适时候,会进入阻塞态,直到阻塞时间

  • 我有两个使用System V共享内存进行通信的程序。 这两个程序都正常工作,但我想添加命名信号量以避免竞争条件。 我尝试了以下方法: 没有信号量,程序可以工作,但有了信号量,共享内存中不会写入任何内容。我做错了什么?当我使用System V共享内存时,是否可能使用这些信号量?