linux 多线程通讯及同步问题

ytuglt 2017-08-12 09:02:57
各位好

问题描述:
1.首先创建4个线程A,B,C,D,分别控制4个功能
2.线程A首先获取一组数据,获取完成后,将数据通知给线程B,线程B得到线程A的数据后,进行处理。
3.线程B将数据处理后,传递给线程C,线程C处理完数据后,通知给线程D,线程D处理结束后将数据保存到mysql

求助点:
如何将数据在线程A,B,C,D 以流水线的形式处理,线程A是不停地获取数据。也就是实现一个模拟流水线的功能

查找网上讲,使用队列来处理,各位给支个招吧,谢谢啦
...全文
958 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
heronism 2018-01-11
  • 打赏
  • 举报
回复
引用
A通过消息队列发送给B,B发给C,C发给D,消息队列类型设置不一样 或者 维护4个链表对应线程Polling, 或者维护4个链表用信号量做同步
同样您的说法,按次序发消息,消息驱动就行了
听雨楼Leeon 2018-01-11
  • 打赏
  • 举报
回复
为什么要创建这么多线程呢?如果A时用来接收消息的,不能阻塞,独立为一个线程可以理解,后来的BCD都要拆开的目的是什么呢,还要增加线程开销?
杨枫_mind 2018-01-07
  • 打赏
  • 举报
回复
1.维护几个个单链表,和全局变量,分别是A-B信息交换单链表(不会就百度数据结构),A-B单链表元素数(count_A_B防止单链表数据无限增殖),同时加1个线程锁(应对双线程并发访问,不会就百度pthread mutex啥的),和一个信号量(A通过信号量启动B,不会就搜索pthread cond); 2.运行方式:A线程接收数据,查看count_A_B,未达到上限则将请求A-B线程锁,数据加入A-B信息交换单链表,释放锁,通过信号量A-B启动B 3.B-C同A-B 4.C-D同A-B
yaokaifen 2018-01-04
  • 打赏
  • 举报
回复
A通过消息队列发送给B,B发给C,C发给D,消息队列类型设置不一样 或者 维护4个链表对应线程Polling, 或者维护4个链表用信号量做同步
yunqing1201 2017-12-27
  • 打赏
  • 举报
回复
主线程当获取数据后,创建线程A,A处理完成后创建线程B,B中再创建线程C,C创建线程D,同时可能会有N多个线程运行,但相互都不影响!!!!
zhxianbin 2017-12-13
  • 打赏
  • 举报
回复
必须 A,B,C,D 以流水线的形式处理吗?流水线的形式可以使用信号量
a()
{
   //处理
  sem_post(a2b)
}

b()
{
  sem_wait(a2b)
   //处理
  sem_post(b2c)
}

c()
{
  sem_wait(b2c)
   //处理
  sem_post(c2d)
}

d()
{
  sem_wait(c2d)
   //处理
}
migerm_78 2017-12-13
  • 打赏
  • 举报
回复
每个线程都建一个队列,数据有了就放入队列,各个线程自己轮询,有数据就处理
代码誊写工 2017-08-13
  • 打赏
  • 举报
回复
给你个不用队列的方法,不过速度不咋地
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

char dataA[64];
char dataB[64];
char dataC[64];
char dataD[64];


void *worker_A(void *arg)
{
    strncpy(dataA, "AAAA", 10);
    printf("workA: %s\n", dataA);
    pthread_exit((void *)&dataA);
}

void *worker_B(void *arg)
{
    char *ret;
    pthread_join(*((pthread_t *)arg), (void **)&ret);
    sprintf(dataB, "%s, BBBB", ret);
    printf("workB: %s\n", dataB);
    pthread_exit((void *)&dataB);
}

void *worker_C(void *arg)
{
    char *ret;
    pthread_join(*((pthread_t *)arg), (void **)&ret);
    sprintf(dataC, "%s, CCCC", ret);
    printf("workC: %s\n", dataC);
    pthread_exit((void *)&dataC);
}

void *worker_D(void *arg)
{
    char *ret;
    pthread_join(*((pthread_t *)arg), (void **)&ret);
    sprintf(dataD, "%s, DDDD", ret);
    printf("workD: %s\n", dataD);
    pthread_exit((void *)&dataD);
}

int main()
{
    pthread_t tidA, tidB, tidC, tidD;
    int i;

    for (i = 0; i < 10; i ++) {

        if (pthread_create(&tidA, NULL, worker_A, NULL)) {
            fprintf(stderr, "pthread_create error.");
            exit(EXIT_FAILURE);
        }

        if (pthread_create(&tidB, NULL, worker_B, (void *)&tidA)) {
            fprintf(stderr, "pthread_create error.");
            exit(EXIT_FAILURE);
        }

        if (pthread_create(&tidC, NULL, worker_C, (void *)&tidB)) {
            fprintf(stderr, "pthread_create error.");
            exit(EXIT_FAILURE);
        }

        if (pthread_create(&tidD, NULL, worker_D, (void *)&tidC)) {
            fprintf(stderr, "pthread_create error.");
            exit(EXIT_FAILURE);
        }

        pthread_join(tidD, (void **)NULL);

    }

    return EXIT_SUCCESS;
}

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧