一、使用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);
}