📜  如何使用C语言使用POSIX信号量

📅  最后修改于: 2021-06-30 00:01:36             🧑  作者: Mango

信号量在进程同步和多线程中非常有用。但是如何在现实生活中使用它,例如用C语言说呢?

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

信号灯的基本代码很简单,如此处所示。但是此代码无法直接编写,因为函数必须是原子函数,而直接编写代码将导致上下文切换而函数完成,并且会导致混乱。

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

  1. 包括semaphore.h
  2. 通过与-lpthread -lrt链接来编译代码

    要锁定信号量或等待,我们可以使用sem_wait函数:

    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 :指定要初始化的信号量。
    • pshared :此参数指定是否在进程之间或线程之间共享新初始化的信号量。非零值表示信号量在进程之间共享,而零值表示它在线程之间共享。
    • value :指定要分配给新初始化的信号量的值。

    要销毁信号量,我们可以使用sem_destroy

    sem_destroy(sem_t *mutex);

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

    代码 –

    // C program to demonstrate working of Semaphores
    #include 
    #include 
    #include 
    #include 
      
    sem_t mutex;
      
    void* thread(void* arg)
    {
        //wait
        sem_wait(&mutex);
        printf("\nEntered..\n");
      
        //critical section
        sleep(4);
          
        //signal
        printf("\nJust Exiting...\n");
        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 ac -lpthread -lrt

    解释 –
    正在创建2个线程,第一个线程之后2秒。
    但是第一个线程在获取锁后将休眠4秒钟。
    因此,第二个线程在调用后不会立即进入,而是在调用后进入4 – 2 = 2秒。
    所以输出是:

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

    但不是:

    Entered..
    
    Entered..
    
    Just Exiting...
    
    Just Exiting...
    
    想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。