- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是我第一次尝试使用 std::future
。
我想同时解析三个不同的文件。三个功能分别做到了这一点。称为 parseSentences
、parseTags
Và parseLinks
。它们中的每一个都通过一个非常简单的 lambda 函数使用 std::async
在单独的线程中启动:[]() { parser->function(); }
,其中 bộ phân tích cú pháp
是一个静态变量,function 是我之前命名的三个函数之一。
int parser::start()
{
int ret = SUCCESS;
ASSERT( m_output != nullptr );
static parser * thisParserInstance = this;
// parsing files
std::future parseSentence = std::async(std::launch::async, []() { return thisParserInstance->parseSentences(); } );
std::future parseLinksResult = std::async(std::launch::async, []() { return thisParserInstance->parseLinks(); } );
std::future parseTagsResult = std::async(std::launch::async, []() { return thisParserInstance->parseTags(); } );
// retrieving the results
ret = parseSentence.get();
const int linksResult = parseLinksResult.get();
const int tagsResult = parseTagsResult.get();
if (ret == SUCCESS)
ret = linksResult == SUCCESS ? tagsResult : linksResult;
return ret;
}
现在,当我在 gdb 中运行我的程序时,在破坏 std::future
局部变量之一时发生段错误。当时有 2 个线程在运行。线程 #1 的调用栈是 đây .线程 #2 的调用栈是 đây .
请注意,第一个调用堆栈中指向cái này
的指针为空,从而导致段错误。
如果有人知道,我将不胜感激。
câu trả lời hay nhất
这里有一个大问题:
static parser * thisParserInstance = this;
这是在您第一次调用该函数时初始化的,然后在以后的调用中保持不变。因此,如果您在一个对象上调用该函数,销毁该对象,然后在第二个对象上调用它,您实际上是在处理一个指向已失效对象的悬空指针。这肯定会产生未定义的行为。
没有理由使用静态变量; lambda 可以捕获 cái này
并作用于正确的对象。或者更简单地说,如评论中所建议的那样,使用可变形式的 không đồng bộ
Sẽ cái này
绑定(bind)到成员函数:
std::async(std::launch::async, &parser::parseSentences, this);
关于c++ - 为什么这段代码会产生竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12150342/
假设我正在使用 APC,其中过程和调用代码都使用 SetLastError 和 GetLastError。这会导致 GetLastError 产生不可预测的值。有什么办法可以解决这个问题吗? VOID
đóng cửa. Câu hỏi này dựa trên ý kiến. Hiện tại nó không chấp nhận câu trả lời. Bạn muốn cải thiện vấn đề này? Cập nhật câu hỏi để có thể trả lời bằng sự kiện và trích dẫn bằng cách chỉnh sửa bài đăng này. Đã đóng 7 năm trước. Cải thiện t
任何人都可以,请告诉我,如何在不进行JavaScript轮询/ setInterval的情况下,在完整日历上填充/显示在服务器端动态更新的数据。 grails中提供了Atmosphere插件,但是文档
我正在尝试调整我的代码,从仅在前台使用 WCSessionDelegate 回调到在后台通过 handleBackgroundTasks: 接受 WKWatchConnectivityRefreshB
我正在构建批处理系统。 单位 的批处理数量从 20 到 1000 不等。每个 Unit 本质上都是模型的层次结构(一个主模型和许多子模型)。我的任务涉及将每个模型层次结构作为单个事务保存到数据库中(每
我拍了一张图片并将其切成三 block ,然后将它们向右浮动,让文字围绕它们流动。 HTML 看起来像这样: 在我添加侧边栏并将其 float 到图像的右上方之前,它工作正常,就像这样... T
我正在考虑嵌入式 Linux 项目(还没有硬件)中即将出现的情况,其中两个外部芯片需要共享一条物理 IRQ 线。这条线在硬件中能够实现边沿触发,但不能实现电平触发中断。 查看 Linux 中的共享 i
我观察到,当 linux futexes 发生争用时,系统会在自旋锁上花费大量时间。我注意到即使不直接使用 futex 也是一个问题,但在调用 malloc/free、rand、glib 互斥调用和其
我终于能够获得一些工具提示,最终可以使用以下代码: Hover over me 然后 $('[rel=tooltip]').tooltip(); 我遇到的问题是它使用 jQueryUI 工
Tôi là một lập trình viên xuất sắc, rất giỏi!