sem_post的介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sem_post的介绍相关的知识,希望对你有一定的参考价值。

参考技术A

sem_post是给信号量的值加上一个“1”,它是一个“原子操作”---即同时对同一个信号量做加“1”操作的两个线程是不会冲突的;而同 时对同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。

Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]

【中文标题】Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]【英文标题】:Sem_post() not working correctly that is neither its increasing the value of semaphore nor unblocking the process attached to that semaphore [duplicate] 【发布时间】:2019-02-05 10:25:27 【问题描述】:

sem_post() 不能正常工作,这既不是增加信号量的值,也不是解除对附加到该信号量阻塞队列的进程的阻塞

#include <stdio.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()

    sem_t pa,ch;
    sem_init(&pa,1,1);  
    sem_init(&ch,1,0);

    pid_t p1;

    p1 = fork();
    if(p1>0)    //Parent process
    
        while(1)
        
        sem_wait(&pa);
        printf("Parent\n");
        sem_post(&ch);
        
    
    else if(p1==0)
    
        while(1)
        
            sem_wait(&ch);
        printf("child\n");
        sem_post(&pa);
        
    
    else
        printf("\nError\n");

    return 0;

预期的输出是

Parent
child
Parent
child
Parent
child
.. and so on..

实际输出是

Parent

【问题讨论】:

请评论您的代码 【参考方案1】:

引用man sem_init

int sem_init(sem_t *sem, int pshared, unsigned int value);

如果pshared非零,则信号量在进程之间共享, 并且应该位于共享内存区域中(参见 shm_open(3), mmap(2) 和 shmget(2))。 (因为由 fork(2) 创建的孩子继承 其父的内存映射,它也可以访问信号量。)任何 可以访问共享内存区域的进程可以在 使用 sem_post(3)、sem_wait(3) 等的信号量。

您的信号量不在共享内存中,因此分叉的子进程将看不到父进程中所做的任何更改(反之亦然)。因此,两个进程都会陷入死锁。

【讨论】:

以上是关于sem_post的介绍的主要内容,如果未能解决你的问题,请参考以下文章

Sem_post() 无法正常工作,这既不是增加信号量的值,也不是解除阻塞附加到该信号量的进程[重复]

sem_wait sem_post信号量操作进本函数

线程同步之信号量(sem_init,sem_post,sem_wait)

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()

Linux C语言 信号量 sem_init() sem_wait() sem_timedwait() sem_post() sem_destroy()

急!LINUX下,GCC编译,原程序包含<semaphore.h>头文件,为啥编译时说sem_wait,sem_post等未定义的引用