【问题标题】:Accessing data (memory) based on event trigger between two programs基于两个程序之间的事件触发访问数据(内存)
【发布时间】:2014-02-28 04:06:49
【问题描述】:

这个问题对某些人来说可能非常基础,但如果有人能在这里消除我的疑问,那就太好了。我有两个软件程序(两个进程),它们通过网络通过标准 TCP 连接进行通信。例如,程序 A 就像一个服务器,不断等待程序 B 的指令和数据。程序 A 收到数据后,立即将数据存储在向量数组中,并执行一个函数,使用数组中的数据并清除它在末尾。例如,在程序 A 内部:

std::vector<int> m_dataArray;

Run()
{
    m_received = false;
    while(1)
    {
        if(m_received)
        {
            Execution();
        }
    }
}

Listener(int data)
{
    m_dataArray.push_back(data);    
    m_received = true;
}

Execution()
{
    m_received = false;

    // read from the data array and do something

    m_dataArray.clear();
}

我的问题是,如果程序 B 一直向程序 A 发送数据,程序 A 是否会将所有这些传入的数据放入缓冲区,直到程序 A 完成当前执行,然后再将新的数据集放入数组中?否则将无法同时访问内存。 (例如,即使程序 A 仍处于执行阶段,m_received 标志也会一直闪烁吗?)

如果这将成为一个问题,那么实施此类操作以避免任何问题的最佳方法是什么?我想过让程序 A 在发送下一个数据之前向程序 B 发出“完成”信号。

【问题讨论】:

  • 在你的例子中是监听器,运行(接收器)和执行(工作者)并发(如在不同的线程/进程中)?
  • 目前不是。在不同的线程上会更好吗?
  • 很好,那么监听器必须被中断调用?如果是这样,它不知道运行的行为将是什么,但同时访问内存不会有问题..如果数据阵列的内容或接收到的操作之间发生变化,您将需要更好地控制运行和执行的行为跨度>

标签: c++ networking memory buffer


【解决方案1】:

这是一个让 Run 和 Execution 对 Listener 在执行时可能会做的事情没有任何问题的示例

std::vector<int> m_dataArray;

Run()
{
    while(1)
    {
        if(m_dataArrayBuffer.length > 0)
        {
            // we take the data out and use it in execute
            // these operations are independent of listener adding additional data
            int data = m_dataArrayBuffer.pop();
            Execution(data);
        }
    }
}

Listener(int data)
{
    m_dataArrayBuffer.push_back(data);    
}

Execution(int data)
{
    // user the data and do something
}

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2016-10-19
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多