首页 > 解决方案 > 如何创建从线程查询的全局可访问对象的持久列表?

问题描述

几个小时以来,我一直在尝试从线程中获取持久对象。我想用 C++ 编写一个共享库,在函数中启动一个持久循环。在以下代码片段中有一个名为 Process 的类。进程初始化 TCP/IP 接口以从 Simulink 模型读取和写入数据。

这仅用于声明,对于这个问题应该不重要,但是现在您知道我在提到流程时所说的内容。

主文件

我知道,它看起来有点丑/不专业,但我对 C++ 还是很陌生。

// frustrated attempt to make everything persistent
static vector<std::thread> processThreads;
static ProcessHandle processHandle;
static vector<std::promise<Process>> promiseProcess;
static vector<std::future<Process>> futureProcess;

EXPORT int initializeProcessLoop(const char *host, int port)
{
    std::promise<Process> promiseObj;
    futureProcess.push_back(std::future<Process>(promiseObj.get_future()));
    processThreads.push_back(std::thread(&ProcessHandle::addProcess, processHandle, host, port, &promiseProcess[0]));

    Process val = futureProcess[0].get();

    processHandle.handleList.push_back(val);

    return (processHandle.handleList.size() - 1);
}

进程句柄.cpp

ProcessHandle 的 addProcess 函数创建应该持久的 Process,将其添加到 ProcessHandle 的静态向量成员,并将 Promise 传递给执行循环。

int ProcessHandle::addProcess(const char *address, int port, std::promise<Process> * promiseObj) {
    Process process(address, port);

    handleList.push_back(process);
    handleList[handleList.size() - 1].exec(promiseObj);
    return handleList.size() - 1;
}

现在主要问题...

如果我将“initializeProcessLoop”更改为包括:

    if(processHandle.handleList[0].isConnected())
    {
        processHandle.handleList[0].poll("/Compare To Constant/const");
    }

在我将“val”推送到 processHandle.handleList 之后,一切正常,我可以按应有的方式轮询数据。

如果我改为从 - 例如 - 主函数轮询它,循环在“initializeProcessLoop”内部崩溃,因为“Process val”被重新分配(?)futureProcess [0] .get()。

函数返回后,如何使 Process 变量和线程循环保持一致?

如果对代码有任何问题(我打赌会有),请随时提问。提前致谢!

PS:强制性“英语不是我的母语,请原谅任何拼写错误或乱码”...

标签: c++multithreadingpromisefuture

解决方案


好的,首先我必须声明,上面和下面的编码风格无论如何都不是最佳实践。

虽然 Sam Varshavchik 在如何以正确的方式学习 C++ 方面仍然是正确的,但只是改变了

Process val = futureProcess[0].get();

static Process val = futureProcess[0].get();

做了这项工作。

要明确:不要这样做。这是一个快速修复,但它会在未来适得其反。但我希望它能帮助任何有类似问题的人。

如果有人有更好的解决方案(它不会变得更糟,可以吗?),请随时添加您对这个问题的答案。


推荐阅读