优点:线程间很容易进行通信, 通过全局变量实现数据共享和交换
缺点:多个线程同时访问共享对象时,需要引入同步和互斥机制
(1)信号量代表某一类资源,其值表示系统中该资源的数量
(2)信号量是一个受保护的变量,只能通过三种操作来访问
* 初始化 sem_init
* P操作(申请资源) sem_wait
* V操作(释放资源) sem_post
信号量的值为非负整数
二值信号量:0 (资源不可用) 1(资源可用)
计数信号量: 0 ~ n

1、sem_init: 初始化信号量
#include
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数: sem --- 初始化的信号量
pshared --- 0(线程间使用)
value --- 信号量的值
返回值:成功: 0
失败: -1, 设置errno
2、sem_wait: p操作
int sem_wait(sem_t *sem);
返回值:成功: 0
失败: -1, 设置errno
3、sem_post:v操作
int sem_post(sem_t *sem);
返回值:成功: 0
失败: -1, 设置errno
#include
#include
#include
#include
#include
#include
char buf[100];
sem_t sem1; //生产者
sem_t sem2; //消费者
void *thread_func(void *arg)
{
while (1)
{
//p操作:申请资源
sem_wait(&sem2);
printf("buf: %s\n", buf);
//v操作:释放资源
sem_post(&sem1);
}
}
int main(int argc, char *argv[])
{
pthread_t thread;
if (0 > sem_init(&sem1, 0, 1))
{
perror("sem_init1");
return -1;
}
if (0 > sem_init(&sem2, 0, 0))
{
perror("sem_init2");
return -1;
}
int err = pthread_create(&thread, NULL, thread_func, NULL);
if (err != 0)
{
fprintf(stderr, "pthread_create: %s\n", strerror(err));
return -1;
}
while (1) //生产者
{
//p操作:申请资源
sem_wait(&sem1);
printf("Input: ");
fgets(buf, sizeof(buf), stdin);
//v操作:释放资源
sem_post(&sem2);
}
return 0;
}