如何创建从线程查询的全局可访问对象的持久列表?

How can I create a persistent list of globally accesible objects queried from threads?

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

这只是为了声明,对于这个问题应该不重要,但是现在你知道我在提到过程时在说什么了。

main.cpp

我知道,它看起来有点 ugly/unprofessional,但我是 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);
}

ProcessHandle.cpp

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

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 之后,一切正常,我可以按应有的方式轮询数据。

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

如何让Process变量和线程循环在函数后保持一致returns?

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

PS:必填项"English is not my native language, please excuse any spelling errors or gibberish"...

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

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

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

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

完成任务。

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

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