功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到buffer,然后通知副线程将数据打印,打印完后,副线程通知主线程继续从输入缓冲区中将读到的字符写到buffer数组。当输入quit命令时,主线程退出,副线程也会随着主线程的结束而自动结束。

 

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <string.h>


char buffer[128];
sem_t sem1;
sem_t sem2;

void *fun(void * arg)
{

    while(1)
    {
        if(sem_wait(&sem2) == -1)  //读之前申请读信号
        {
            perror("sem_wait sem2");
            exit(-1);
        }
        printf(">>>%s",buffer);
        if(sem_post(&sem1) == -1)  //读完了后发送写信号
        {
            perror("sem_wait sem2");
            exit(-1);
        }
    }

}

int main(void)
{

    pthread_t thread;

    if(sem_init(&sem1, 0, 1) == -1)  //将写信号初始化为1
    {
        perror("sem_init");
        exit(-1);
    }
    if(sem_init(&sem2, 0, 0) == -1) //将读信号初始化为0
    {
        perror("sem_init");
        exit(-1);
    }
    if(-1 == pthread_create(&thread, NULL, fun, NULL))  //创建线程
    {
        exit(-1);
    }

    do
    {
        if(sem_wait(&sem1) == -1)  //写之前申请写资源
        {
            perror("sem_wait sem1");
            exit(-1);
        }
        fgets(buffer, 128, stdin);
        if(sem_post(&sem2) == -1)  //写之后发送读资源
        {
            perror("sem_wait sem1");
            exit(-1);
        }
    }while(strncmp(buffer, "quit", 4) != 0); //输入quit,主线程结束,副线程也就退出


    return 0;
}

线程同步一例

相关文章:

  • 2021-08-09
  • 2021-08-26
  • 2021-11-07
  • 2021-12-29
  • 2022-12-23
  • 2021-05-28
  • 2021-04-08
猜你喜欢
  • 2021-08-21
  • 2022-12-23
  • 2022-02-02
  • 2022-12-23
  • 2022-12-23
  • 2021-12-07
相关资源
相似解决方案