<aside> 💡 信号量机制
</aside>
<aside> 💡 信号量的类型:sem_t
</aside>
初始化与释放
sem_init
:初始化信号量
sem
:信号量变量的地址pshared
:0表示在线程间同步,非0表示在进程间同步value
:指定信号量的值sem_destroy
:释放资源wait
sem_wait
:对信号量加锁,调用一次对信号量的值-1,如果值为0则阻塞sem_trywait
:尝试对信号量加锁sem_timedwait
:阻塞等待一定时间post
sem_post
:对信号量解锁,调用一次对信号量的值+1,如果值为value则阻塞其他
sem_getvalue
:获取当前信号量的值,sval
为传出参数#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <semaphore.h>
// 创建一个互斥量
pthread_mutex_t mutex;
// 创建两个信号量
sem_t psem;
sem_t csem;
struct Node{
int num;
struct Node *next;
};
// 头结点
struct Node * head = NULL;
void * producer(void * arg) {
// 不断的创建新的节点,添加到链表中
while(1) {
sem_wait(&psem);
pthread_mutex_lock(&mutex);
struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
newNode->next = head;
head = newNode;
newNode->num = rand() % 1000;
printf("add node, num : %d, tid : %ld\\n", newNode->num, pthread_self());
pthread_mutex_unlock(&mutex);
sem_post(&csem);
}
return NULL;
}
void * customer(void * arg) {
while(1) {
sem_wait(&csem);
pthread_mutex_lock(&mutex);
// 保存头结点的指针
struct Node * tmp = head;
head = head->next;
printf("del node, num : %d, tid : %ld\\n", tmp->num, pthread_self());
free(tmp);
pthread_mutex_unlock(&mutex);
sem_post(&psem);
}
return NULL;
}