- 有名信号量(进程间通信,创建它需要经过【文件系统】)
- 无名信号量(线程间通信,直接在地址空间中创建,不会经过【文件系统】)
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
sem_t sem_A;
sem_t sem_B;
sem_t sem_C;
void* thread_A(void * arg)
{
while (1)
{
sem_wait(&sem_A);
puts(__FUNCTION__);
sleep(5);
sem_post(&sem_B);
}
}
void* thread_B(void * arg)
{
while (1)
{
sem_wait(&sem_B);
puts(__FUNCTION__);
sleep(5);
sem_post(&sem_C);
}
}
void* thread_C(void * arg)
{
while (1)
{
sem_wait(&sem_C);
puts(__FUNCTION__);
sleep(5);
sem_post(&sem_A);
}
}
int main()
{
sem_init(&sem_A, 0, 1);
sem_init(&sem_B, 0, 0);
sem_init(&sem_C, 0, 0);
pthread_t th_A;
pthread_t th_B;
pthread_t th_C;
pthread_create(&th_A, NULL, thread_A, NULL);
pthread_create(&th_B, NULL, thread_B, NULL);
pthread_create(&th_C, NULL, thread_C, NULL);
pthread_join(th_A, NULL);
pthread_join(th_B, NULL);
pthread_join(th_C, NULL);
return 0;
}
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
// - 有名信号量(进程间通信,创建它需要经过【文件系统】)
// - 无名信号量(线程间通信,直接在地址空间中创建,不会经过【文件系统】)
sem_t sem_A;
sem_t sem_B;
sem_t sem_C;
void* thread_A(void * arg)
{
while (1)
{
// 函数"sem_wait()"用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减去1,表明公共资源
// 经使用后减少
sem_wait(&sem_A);
puts(__FUNCTION__);
sleep(5);
// 函数"sem_post()"用来增加信号量的值
sem_post(&sem_B);
}
}
void* thread_B(void * arg)
{
while (1)
{
sem_wait(&sem_B);
puts(__FUNCTION__);
sleep(5);
sem_post(&sem_C);
}
}
void* thread_C(void * arg)
{
while (1)
{
sem_wait(&sem_C);
puts(__FUNCTION__);
sleep(5);
sem_post(&sem_A);
}
}
int main()
{
// 用来初始化一个信号量
sem_init(&sem_A, 0, 1);
sem_init(&sem_B, 0, 0);
sem_init(&sem_C, 0, 0);
// pthread_t用于声明线程ID
pthread_t th_A;
pthread_t th_B;
pthread_t th_C;
// pthread_create()创建线程的函数
// 第二个参数用到设置线程属性,分配多少的栈空间,以及运行优先级
pthread_create(&th_A, NULL, thread_A, NULL);
pthread_create(&th_B, NULL, thread_B, NULL);
pthread_create(&th_C, NULL, thread_C, NULL);
// pthread_join用来等待一个线程的结束(主线程用于等待子线程结束)
// 第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值
pthread_join(th_A, NULL);
pthread_join(th_B, NULL);
pthread_join(th_C, NULL);
return 0;
}