线程同步一例

本文介绍了一个简单的多线程程序示例,通过使用信号量实现主线程与副线程之间的数据传递。主线程负责从键盘接收输入并将数据放入缓冲区,副线程则负责读取缓冲区中的数据并打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

功能:主线程创建一个副线程,然后主线程负责将键盘输入的内容写到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;
}

image

转载于:https://www.cnblogs.com/pengdonglin137/archive/2013/03/10/2952427.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值