c++ - 如何创建从线程查询的全局可访问对象的持久列表?
问题描述
几个小时以来,我一直在尝试从线程中获取持久对象。我想用 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:强制性“英语不是我的母语,请原谅任何拼写错误或乱码”...
解决方案
好的,首先我必须声明,上面和下面的编码风格无论如何都不是最佳实践。
虽然 Sam Varshavchik 在如何以正确的方式学习 C++ 方面仍然是正确的,但只是改变了
Process val = futureProcess[0].get();
至
static Process val = futureProcess[0].get();
做了这项工作。
要明确:不要这样做。这是一个快速修复,但它会在未来适得其反。但我希望它能帮助任何有类似问题的人。
如果有人有更好的解决方案(它不会变得更糟,可以吗?),请随时添加您对这个问题的答案。
推荐阅读
- r - 如何仅保留数据框列中所有行的最后 X 个字符
- html - Angular 材质进度条与两个值对齐
- sql-server - 存储过程正确运行,但 DataReader 得到错误结果...有时
- flutter - Flutter - 根据用户文本输入从 API 刷新列表的位置
- css - 如何使用 no-gutter 删除列之间的空间
- html - 用重复的线性渐变改变颜色
- javascript - 如何在 NPM 包中使用 webpack 动态导入?
- apache-flink - Flink 自动/程序化保存点
- mongodb - 如何使用 lambda 函数在 mongodb 中的两个集合之间进行多个连接?
- javascript - 检查图像 URL 是否使用 Javascript