多个线程按照约定的顺序相护配合完成一件事情
多线程中主线程与子线程执行的顺序:
https://blog.csdn.net/Maspue/article/details/82875202
要求:通过线程实现数据的输入输出,主线程循环从终端输入,线程函数将数据循环输出,当输入quit结束程序。
- 全局变量标志位实现
- 信号量实现
char buf[32] = "";
int flag = 0;
void *print_handler(void *arg)
{
while(1)
{
if(flag == 1)
{
if(strcmp(buf, "quit") == 0)
break;
printf("buf:%s\n", buf);
flag = 0;
}
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, const char *argv[])
{
pthread_t tid;
if(pthread_create(&tid, NULL, print_handler, NULL) != 0)
{
perror("pthread create err");
return -1;
}
while(1)
{
if(flag == 0)
{
scanf("%s", buf);
flag = 1;
if(strcmp(buf, "quit") == 0)
break;
}
}
pthread_join(tid, NULL);
return 0;
}
信号量操作
int sem_init(sem_t *sem,int pshared,unsigned int value)
//P操作 申请资源 先对信号量的值进行减一,此时若信号量的值<0,则函数阻塞
int sem_wait(sem_t *sem)
//V操作 释放资源 释放一次信号量的值加1,函数不阻塞
int sem_post(sem_t *sem)
char buf[32] = "";
sem_t sem, sem1;
void *print_handler(void *arg)
{
while(1)
{
sem_wait(&sem); //p操作,申请资源
if(strncmp(buf, "quit", 4) == 0)
break;
printf("buf:%s", buf);
sem_post(&sem1);//可以输入了
}
pthread_exit(NULL);
return NULL;
}
int main(int argc, const char *argv[])
{
pthread_t tid;
if(pthread_create(&tid, NULL, print_handler, NULL) != 0)
{
perror("pthread create err");
return -1;
}
if(sem_init(&sem, 0, 0) < 0)
{
perror("sem init err");
return -1;
}
if(sem_init(&sem1, 0, 1) < 0)
{
perror("sem init err");
return -1;
}
while(1)
{
sem_wait(&sem1); //-1->0
fgets(buf, 32, stdin);
sem_post(&sem);//v操作,释放资源 可以输出了
if(strncmp(buf, "quit", 4) == 0)
break;
}
pthread_join(tid, NULL);
return 0;
}