方法一:信号量
类似于生产者和消费者问题
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
sem_t blank_number, product_number;
void *producer(void *arg)
{
while (1) {
sem_wait(&blank_number);//给blank_number信号量减1,如果blank_number为0,在这里阻塞,直到blank_number不为0
printf("%c\n",65);
sem_post(&product_number);//给product_number加1
sleep(rand()%5);
}
}
void *consumer(void *arg)
{
while (1) {
sem_wait(&product_number);
printf("%c\n",66);
sem_post(&blank_number);
sleep(rand()%5);
}
}
int main(int argc, char *argv[])
{
pthread_t pid, cid;
sem_init(&blank_number, 0, 1);//对信号量进行初始化
sem_init(&product_number, 0, 0);
pthread_create(&pid, NULL, producer, NULL);
pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);//回收线程,当然这块两个线程由于一直在while循环,线程会一直阻塞在这句话
pthread_join(cid, NULL);
sem_destroy(&blank_number);//销毁信号量
sem_destroy(&product_number);
return 0;
}
方法二、互斥量
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>
pthread_mutex_t mutex;
int flag=1;//因为是linux下c语言实现的,所以不能写成bool flag=true;因为bool类型是C++新增的类型
void *printA(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
if(flag==1)
printf("%c\n",65);
flag=0;
pthread_mutex_unlock(&mutex);
sleep(rand()%5);
}
}
void *printB(void *arg)
{
while (1) {
pthread_mutex_lock(&mutex);
if(flag==0)
printf("%c\n",66);
flag=1;
pthread_mutex_unlock(&mutex);
sleep(rand()%5);
}
}
int main(int argc, char *argv[])
{
pthread_t aid, bid;
pthread_mutex_init(&mutex,NULL);
pthread_create(&aid, NULL, printA, NULL);//创建线程
pthread_create(&bid, NULL, printB, NULL);
pthread_join(aid, NULL);//回收线程
pthread_join(bid, NULL);
pthread_mutex_destroy(&mutex);//销毁互斥量
return 0;