开三个线程采集数据,开一个线程把前三个线程采集到的最新数据发出,这个模型怎么实现?大佬们

思维逆逝 2018-01-17 09:56:06
开三个线程采集数据,开一个线程把前三个线程采集到的最新数据发出,这个模型怎么实现?大佬们
...全文
659 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_with_the_winds 2018-01-18
  • 打赏
  • 举报
回复
引用 8 楼 hongke123123 的回复:
[quote=引用 2 楼 ysu_yujie 的回复:] 三个线程对应三个数据缓冲区,当相应的缓冲区存储完成后,则设置对应的标志位,或者发送事件。在发送线程里面等待三个事件或监测三个标志位,当均满足之后发送数据
说详细点,线程一每10ms采集一次数据,线程二每10ms采集一次数据,线程三每20ms采集一次数据,线程四每20ms把前三个采集到的数据汇总发送出去,比如tcp发送。线程四发送时,只发送他们的最新数据,而不是采集到的所有数据。 [/quote] 说一种最简单的实现方案。定义三个缓冲区,分别由三个线程写数据,然后由第四个线程读并发送。然后每个缓冲区定义两个索引,分别对应读索引和写索引。以第一个线程为例,线程一采集时间到了之后根据写索引向缓冲区写数据,然后更新写索引。当第四个线程发送时间到了之后,根据读索引读取数据并更新读索引,一直到读索引与写索引相等之后,数据读取完毕。
赵4老师 2018-01-18
  • 打赏
  • 举报
回复
《Windows核心编程》
super_admi 2018-01-17
  • 打赏
  • 举报
回复
如果是Windows下面,可以直接用WaitForMultipleObjects等待你所有的采集线程结束,然后发送数据。参考代码如下:
#include<Windows.h>
#include<stdio.h>

#define THREAD_MAX 3

//互斥锁
HANDLE hMutex1;
int nThreadCount = 0;
bool bSend = false;

void addThreadCount(){
    WaitForSingleObject(hMutex1,INFINITE);
    nThreadCount++;
    printf("nThreadCount: %d\n", nThreadCount);
    ReleaseMutex(hMutex1);
}

void subThreadCount(){
    WaitForSingleObject(hMutex1,INFINITE);
    printf("nThreadCount: %d\n", nThreadCount);
    nThreadCount--;
    ReleaseMutex(hMutex1);
}

void doSendData(LPVOID lpParamter){
    WaitForSingleObject(hMutex1,INFINITE);
    if(0 == nThreadCount && !bSend){
        printf("Send Data: %d\n", (int)lpParamter);
        bSend = true;
    }
    ReleaseMutex(hMutex1);
}

DWORD WINAPI doThread(LPVOID lpParamter)
{
    //addThreadCount();
    for(int i = 0; i < 5; i++)
    {
        printf("Running: 数据采集线程(%d)\n", (int)lpParamter);
        Sleep(10);
    }
    //subThreadCount();
    //doSendData(lpParamter);
}

int main()
{
    //创建一个锁
    hMutex1  =CreateMutex(NULL,FALSE,NULL);
    bSend = false;
    HANDLE handles[THREAD_MAX] = {0};

    //创建线程
    for(int i = 0; i < THREAD_MAX; i++){
        handles[i] = CreateThread(NULL, 0, doThread, (LPVOID)(i + 1), 0, NULL);
    }
    WaitForMultipleObjects(THREAD_MAX, handles, FALSE, INFINITE);
    printf("Send Data.\n");
    for(int i = 0; i < THREAD_MAX; i++){
        CloseHandle(handles[i]);
    }
    //while(1);

    return 0;
}
fly_with_the_winds 2018-01-17
  • 打赏
  • 举报
回复
三个线程对应三个数据缓冲区,当相应的缓冲区存储完成后,则设置对应的标志位,或者发送事件。在发送线程里面等待三个事件或监测三个标志位,当均满足之后发送数据
super_admi 2018-01-17
  • 打赏
  • 举报
回复
这个就是多线程同步问题了。 我是这么考虑的: 1.定义一个计数器,用来统计线程数量,每次使用这个计数器时,都要进行锁定; 2.启动一个线程,计数器+1; 3.每当一个线程结束时,计数器-1; 4.线程末尾判断:如果计数器为0,则发送数据,或者启动数据发送线程。
思维逆逝 2018-01-17
  • 打赏
  • 举报
回复
引用 2 楼 ysu_yujie 的回复:
三个线程对应三个数据缓冲区,当相应的缓冲区存储完成后,则设置对应的标志位,或者发送事件。在发送线程里面等待三个事件或监测三个标志位,当均满足之后发送数据
说详细点,线程一每10ms采集一次数据,线程二每10ms采集一次数据,线程三每20ms采集一次数据,线程四每20ms把前三个采集到的数据汇总发送出去,比如tcp发送。线程四发送时,只发送他们的最新数据,而不是采集到的所有数据。
思维逆逝 2018-01-17
  • 打赏
  • 举报
回复
引用 1 楼 super_admi 的回复:
这个就是多线程同步问题了。 我是这么考虑的: 1.定义一个计数器,用来统计线程数量,每次使用这个计数器时,都要进行锁定; 2.启动一个线程,计数器+1; 3.每当一个线程结束时,计数器-1; 4.线程末尾判断:如果计数器为0,则发送数据,或者启动数据发送线程。
说详细点,线程一每10ms采集一次数据,线程二每10ms采集一次数据,线程三每20ms采集一次数据,线程四每20ms把前三个采集到的数据汇总发送出去,比如tcp发送。线程四发送时,只发送他们的最新数据,而不是采集到的所有数据。
宁南学者 2018-01-17
  • 打赏
  • 举报
回复
三个采集线程,维护三个队列,或者环形队列,当某个队列满时,通过发送消息,唤醒 发送线程,完成发送。 整个过程,注意 线程间同步 与 加锁情况...
csulizhang 2018-01-17
  • 打赏
  • 举报
回复
三个采集线程维持三个消息队列push数据,发送线程可以用轮询的方式,按顺序分别从三个消息队列pop数据发送,pop数据的时候注意给队列加锁
ooolinux 2018-01-17
  • 打赏
  • 举报
回复
基本同2楼,不过不是“均满足之后发送数据”,而是一个采集线程采集满它的缓冲区设置事件或者标志变量以后,发送线程等待到这个事件或者标志变量,就可以发送数据了。不过好像需要3个发送线程等待各自的采集线程。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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