sem_init函数的返回值是什么

sem_init函数的返回值是什么,第1张

应该这样

#define CHECK(_sem) (sem_init(&(_sem)->sem, (pshared), (value)) == 0) ? ((_sem)->valid = true, 0) : ((_sem)->valid = false, -1)

然后使用的地方为

ret = CHECK(_sem)

也就是说,sem_init返回0时,_sem->valid被设置成true, ret被设置为0,

sem_init返回非0时,_sem->valid被设置成false, ret被设置为-1

struct rwlock

{

    sem_t read

    sem_t write

    int reads

}

void RWLock_Init(rwlock &lock)

{

    sem_init(lock.read, 0, 1)

    sem_init(lock.write, 0, 1)

    lock.reads = 0

}

void Acquir_read_lock(rwlock &lock)

{

    sem_wait(&lock.read)

    ++lock.reads

    if(lock.reads == 1)

    {

        sem_wait(&lock.write)

    }

    sem_post(&lock.write)

}

void acquir_read_unlock(rwlock &lock)

{

    sem_wait(&lock.read)

    --lock.reads

    if(lock.reads == 0)

    {

        sem_post(&lock.write)

    }

    sem_post(&lcok.read)

}

void acquir_write_lock(rwlock &lock)

{

    sem_wait(&lock.write)

}

void acquir_write_unlock(rwlock * lock)

{

    sem_post(&lock.write)

}

sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。

sem_wait:一直阻塞等待直到信号量>0。

sem_timedwait:阻塞等待若干时间直到信号量>0。

sem_post:使信号量加1。

sem_destroy:释放信号量。和sem_init对应。 答案补充 关于各函数的具体参数请用man查看,如man sem_init可查看该函数的帮助

信号量的工作原理

由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:

P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行

V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1.

举个例子,就是两个进程共享信号量sv,一旦其中一个进程执行了P(sv)操作,它将得到信号量,并可以进入临界区,使sv减1。而第二个进程将被阻止进入临界区,因为当它试图执行P(sv)时,sv为0,它会被挂起以等待第一个进程离开临界区域并执行V(sv)释放信号量,这时第二个进程就可以恢复执行。

Linux的信号量机制

Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/132019.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-16
下一篇2023-03-16

发表评论

登录后才能评论

评论列表(0条)

    保存