两个线程,一个线程打印A,一个线程打印B,如何实现两个线程按顺序打印ABABAB

两个线程交叉打印AB这是很常见的一个面试题,所以记录下来为找工作做准备。在linux下通过信号量和互斥量两种方式实现,信号量和互斥量其实都是线程同步的方法。

方法一:信号量

printabab.c

#include 
#include 
#include 
#include 

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;
}

信号量方法就是使用生产者和消费者模型实现的

执行结果如下:

两个线程,一个线程打印A,一个线程打印B,如何实现两个线程按顺序打印ABABAB_第1张图片

 

方法二:互斥量

printab.c

#include 
#include 
#include 
#include 

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;
}

执行结果如下:

两个线程,一个线程打印A,一个线程打印B,如何实现两个线程按顺序打印ABABAB_第2张图片

你可能感兴趣的:(线程同步)