各位好问题描述:
1.首先创建4个线程A,B,C,D,分别控制4个功能
2.线程A首先获取一组数据,获取完成后,将数据通知给线程B,线程B得到线程A的数据后,进行处理。
3.线程B将数据处理后,传递给线程C,线程C处理完数据后,通知给线程D,线程D处理结束后将数据保存到mysql求助点:
如何将数据在线程A,B,C,D 以流水线的形式处理,线程A是不停地获取数据。也就是实现一个模拟流水线的功能查找网上讲,使用队列来处理,各位给支个招吧,谢谢啦

解决方案 »

  1.   

    给你个不用队列的方法,不过速度不咋地
    #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;
    }
      

  2.   

    必须 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)
       //处理
    }
      

  3.   

    主线程当获取数据后,创建线程A,A处理完成后创建线程B,B中再创建线程C,C创建线程D,同时可能会有N多个线程运行,但相互都不影响!!!!
      

  4.   

    A通过消息队列发送给B,B发给C,C发给D,消息队列类型设置不一样   或者  维护4个链表对应线程Polling, 或者维护4个链表用信号量做同步
      

  5.   

    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
      

  6.   

    为什么要创建这么多线程呢?如果A时用来接收消息的,不能阻塞,独立为一个线程可以理解,后来的BCD都要拆开的目的是什么呢,还要增加线程开销?