前言
本文主要是用C语言来实现上面的功能,将介绍两种方法,一种需要用到条件锁,一种不需要条件锁。
提示:以下是本篇文章正文内容,下面案例可供参考
一、用条件锁来实现这个功能
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t condNum;
static pthread_cond_t condAZ;
void* printNum(void* arg)//输出数字
{
int a = 0;
while (a<52)
{
pthread_mutex_lock(&mtx);
pthread_cond_wait(&condAZ, &mtx);
printf("%d",++a);
printf("%d",++a);
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&condNum);
}
}
void* printAZ(void* arg)//输出字母
{
char b = 'A';
while (b<='Z')
{
pthread_mutex_lock(&mtx);
pthread_cond_wait(&condNum, &mtx);
printf("%c",b++);
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&condAZ);
}
}
int main()
{
pthread_t threadNum;
pthread_t threadAZ;
pthread_cond_init(&condNum, NULL)
pthread_cond_init(&condAZ, NULL);
pthread_create(&threadNum, NULL, &printNum, NULL);
pthread_create(&threadAZ, NULL, &printAZ, NULL);
sleep(1);
pthread_cond_signal(&condAZ);//唤醒打印数字
pthread_join(threadNum, NULL);
pthread_join(threadAZ, NULL);
printf("\n");
return 0;
}
二、不用条件锁来实现这个功能
代码如下(示例):
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
int lock = 0;
void* printNum(void* arg)
{
int a = 0;
while (a<52)
{
if(lock == 0)
{
printf("%d",++a);
printf("%d",++a);//自增放在判断语句里面
fflush(stdout);
lock = 1;//用来唤醒输出字母
}
}
}
void* printAZ(void* arg)
{
char b = 'A';
while (b<='Z')
{
if(lock == 1)
{
printf("%c",b++);
fflush(stdout);
lock = 0;//用来唤醒输出数字
}
}
}
int main()
{
pthread_t threadNum;
pthread_t threadAZ;
if(0!=pthread_create(&threadNum, NULL, &printNum, NULL))
{
perror("pthread_create");
return -1;
}
if(0 != pthread_create(&threadAZ, NULL, &printAZ, NULL))
{
perror("pthread_create");
return -1;
}
pthread_join(threadNum, NULL);
pthread_join(threadAZ, NULL);
printf("\n");
return 0;
}
总结
其实这两种方法都是可以的,一种是我们自己创造一个标志性变量,一个是利用C库函数,各有优势,希望对你有所帮助。