【Linux】P/V信号量

539 阅读1分钟

一、使用PV信号量完成进程间、线程间通信

二、P/V信号量的用法

1.int sem_init(sem_t *__sem, int __pshared, unsigned __value)

(1)sem信号量
(2)pshared 0表示进程内线程间共享, 1表示进程间共享
(3)value表示信号量的初始值

2.sem_post(sem_t *sem)

(1)原子性操作
(2)信号量+1
(3)当有线程阻塞在这个信号量上时,调用这个函数会使其中一个线程不阻塞,选择恢复的线程由线程调度策略决定

3.sem_wait(sem_t *sem)

(1)原子性操作
(2)信号量-1
(3)当信号量小于等于0时,阻塞线程

4.sem_trywait(sem_t *sem)

(1)原子性操作
(2)信号量-1

5.sem_destroy(sem_t *sem)

释放信号量

三、信号量demo

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t g_sem;

void thread_task_a()
{
    sem_wait(&g_sem);
    printf("thread a is working\n");
}

void thread_task_b()
{
    sem_wait(&g_sem);
    printf("thread b is working\n");
}

void main()
{
    pthread_t id_a;
    pthread_t id_b;

    sem_init(&g_sem, 0, 0);

    pthread_create(&id_a, NULL, (void *)thread_task_a, NULL);
    pthread_create(&id_b, NULL, (void *)thread_task_b, NULL);

    unsigned int index;
    for (index = 0; index < 20; index++) {
        printf("main thread is working\n");
    }
    sem_post(&g_sem);
    sem_post(&g_sem);
    pthread_join(&id_a, NULL);
    pthread_join(&id_b, NULL);
    sem_destroy(&g_sem);
}