本文使用值为0的信号量实现两个线程同步,交替打印A和B
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
typedef void *(*Func)(void *); //使用typedef定义函数指针
sem_t sem; //创建信号量
void *func1(void *args)
{
for (;;)
{
sem_wait(&sem); //(--操作)由于sem的初始值为0,该线程阻塞,后执行
printf("A\n");
sleep(1);
}
pthread_exit(NULL);
}
void *func2(void *args)
{
for (;;)
{
printf("B\n");
sem_post(&sem); //(++操作),此时sem的值为1,另一个线程可以执行
sleep(1);
}
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
int ret = sem_init(&sem, 0, 0); //初始化信号量,在线程中共享,初始值为0
pthread_t tid[2]; //定义线程ID
Func func[2] = {func1, func2}; //定义函数指针,用于存放线程对应的执行函数
//或者void*(*func[2])(void*);
//循环创建子线程
int i = 0;
for (; i < 2; ++i)
{
int ret = pthread_create(tid + i, NULL, func[i], NULL);
if (ret != 0)
{
fprintf(stderr, "pthread_create error:%s\n", strerror(ret));
exit(EXIT_FAILURE);
}
//sleep(3); //放大效果
}
for (i = 0; i < 2; i++)
{
pthread_join(tid[i], NULL);
}
sem_destroy(&sem);
return 0;
}