如何在C语言中使用POSIX信号量

信号灯 在进程同步和多线程处理中非常有用。但如何在现实生活中使用,比如说在C语言中?

null

我们在Linux系统中有POSIX信号库。让我们学习如何使用它。

信号量的基本代码如下所示 在这里 .但此代码不能直接编写,因为函数要求是原子的,直接编写代码会导致上下文切换而没有函数完成,并会导致混乱。

Linux中的POSIX系统提供了自己的内置信号量库。要使用它,我们必须:

  1. 包括信号量。H
  2. 通过链接-lpthread-lrt编译代码

    要锁定信号灯或等待,我们可以使用 等等 功能:

    int sem_wait(sem_t *sem);

    要释放或发送信号量,我们使用 sem_post 功能:

    int sem_post(sem_t *sem);

    通过使用 sem_init (对于进程或线程)或 sem_open (适用于IPC)。

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

    哪里

    • 扫描电镜 :指定要初始化的信号量。
    • 共享 :此参数指定是否在进程之间或线程之间共享新初始化的信号量。非零值表示进程之间共享信号量,零值表示线程之间共享信号量。
    • 价值 :指定要分配给新初始化的信号量的值。

    要破坏信号量,我们可以使用 sem_销毁 .

    sem_destroy(sem_t *mutex);

    要声明信号量,数据类型为sem_t。

    代码–

    // C program to demonstrate working of Semaphores
    #include <stdio.h>
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    sem_t mutex;
    void * thread ( void * arg)
    {
    //wait
    sem_wait(&mutex);
    printf ( "Entered.." );
    //critical section
    sleep(4);
    //signal
    printf ( "Just Exiting..." );
    sem_post(&mutex);
    }
    int main()
    {
    sem_init(&mutex, 0, 1);
    pthread_t t1,t2;
    pthread_create(&t1,NULL, thread ,NULL);
    sleep(2);
    pthread_create(&t2,NULL, thread ,NULL);
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    sem_destroy(&mutex);
    return 0;
    }

    
    

    编译应该使用gcc a.c-lpthread-lrt完成

    解释—— 正在创建两个线程,第一个线程后2秒创建一个线程。 但第一个线程在获得锁后将休眠4秒。 因此,第二个线程在被调用后不会立即进入,它将在被调用后进入4–2=2秒。 所以结果是:

    Entered..
    
    Just Exiting...
    
    Entered..
    
    Just Exiting...
    
    

    但不是:

    Entered..
    
    Entered..
    
    Just Exiting...
    
    Just Exiting...
    

    本文由 超级机器人 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

    如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享