互斥量在繁忙时被破坏

2024-01-07

EventHandler类有一个单例对象来接收来自主线程的事件。它将输入注册到向量,并创建一个运行 lambda 函数的线程,该函数在从向量中删除输入之前等待一段时间,以防止在一段时间内重复执行该输入的事件。

但我在繁忙错误时遇到互斥体被破坏的情况。我不确定它发生在哪里以及如何发生。我什至不确定它是什么意思,因为它不应该作为单例对象被解构。一些帮助将不胜感激。

class EventHandler{
public:
    std::mutex simpleLock;
    std::vector<UInt32> stuff;
    void RegisterBlock(UInt32 input){
        stuff.push_back(input);
        std::thread removalCallBack([&](UInt32 input){
            std::this_thread::sleep_for(std::chrono::milliseconds(200));
            simpleLock.lock();
            auto it = Find(stuff, input);
            if (it != stuff.end())
                stuff.erase(it);
            simpleLock.simpleLock.unlock();
        }, input)
        removalCallBack.detach();
    }
    virtual EventResult ReceiveEvent(UInt32 input){
            simpleLock.lock();
            if (Find(stuff, input) != stuff.end()){
                RegisterBlock(input));
                //dostuff
            }
            simpleLock.simpleLock.unlock();
    }
};

正在发生的事情是创建了一个线程

std::thread removalCallBack([&](UInt32 input){
   std::this_thread::sleep_for(std::chrono::milliseconds(200));
   simpleLock.lock();
   ...
removalCallBack.detach();

然后自从移除回调是函数的局部变量注册块,当函数退出时,析构函数为移除回调被调用会调用std::终止()

线程析构函数的文档 http://en.cppreference.com/w/cpp/thread/thread/~thread

〜线程(); (自 C++11 起)

销毁线程对象。如果 *this 仍然有一个关联的正在运行的线程(即 joinable() == true),则调用 std::terminate()。

但要看时机,简单锁当线程退出时,它仍然由线程拥有(很忙),根据规范,这会导致未定义的行为,在您的情况下忙碌时被毁 error.

为了避免此错误,您应该允许线程在函数退出后存在(例如,不要将其设为局部变量),或者在函数退出之前阻塞直到线程退出线程::加入

处理线程后的清理可能很棘手,特别是如果它们本质上用作占用相同地址空间的不同程序,并且在这种情况下很多时候manager正如您所想到的那样,线程被创建,其唯一的工作就是回收与线程相关的资源。由于在创建的线程中完成的工作很简单,您的情况会更容易一些移除回调,但仍有清理工作要做。

如果线程对象要通过new创建,那么虽然C++线程对象所代表的系统线程使用的系统资源将被清理,但该对象使用的内存将保持分配状态,直到调用delete为止。

另外,请考虑如果程序在有线程运行时退出,那么线程将被终止,但如果发生这种情况时锁定了互斥体,则将再次出现未定义的行为。

为了保证线程不再运行,通常要做的就是加入它,但是尽管如此this http://en.cppreference.com/w/cpp/thread/thread/join没有说, pthread_join 手册页指出

一旦线程被分离,它就无法使用 pthread_join(3) 连接或再次可连接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互斥量在繁忙时被破坏 的相关文章

  • 每个客户端一个线程与线程服务器的排队线程模型之间的相对优点?

    假设我们正在构建一个线程服务器 旨在在具有四个核心的系统上运行 我能想到的两种线程管理方案是每个客户端连接一个线程和一个排队系统 正如第一个系统的名称所暗示的那样 我们将为每个连接到服务器的客户端生成一个线程 假设一个线程始终专用于程序的主
  • 从另一个线程调用 show 后 Windows 窗体窗体挂起

    我的应用程序有一些异步运行的网络代码 我附加了一些在没有连接到服务器时抛出的事件 并且在发生这种情况时我正在创建一些 操作失败 表单 问题是我的表单在创建后挂起 我读到了相关内容 并尝试这样做 public void ShowView if
  • 如何判断一个类型是否派生自模板类?

    如何确定类型是否派生自模板类 特别是 我需要确定模板参数是否具有std basic ostream作为基类 通常情况下std is base of是完成这项工作的工具 然而 std is base of仅适用于完整类型 不适用于类模板 我正
  • 如何在 Android 中检查与配对设备的蓝牙连接状态

    我开发了一个蓝牙应用程序 它将连接到配对的设备并发送消息 但我必须先测试连接 我尝试了很多选择 但没有一个效果很好 那么您能给我发送任何可以做到这一点的代码示例吗 我创建了一个线程 但无法获得良好的连接状态来构建 if 函数 这是代码 pa
  • java替代Thread.stop()来中断特定调用

    我正在寻找一种方法来告诉这个调用 大约需要 20 120 秒 final Area image final AffineTransform transform new AffineTransform transform scale imag
  • 模板、decltype 和非类类型

    我有一个像这样的函数定义 template
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 想要并行运行非线程安全库 - 可以使用多个类加载器来完成吗?

    我从事的一个项目中 我们使用的库不能保证线程安全 实际上也不是 并且在 Java 8 流场景中是单线程的 它按预期工作 我们希望使用并行流来获得容易实现的可扩展性成果 不幸的是 这会导致库失败 很可能是因为一个实例干扰与另一实例共享的变量
  • 无法创建 constexpr std::vector

    我可以创造constexpr标准 数组 constexpr std array
  • 多线程读取xml文件

    我进行了很多搜索 但找不到适合我的问题的解决方案 我编写了一个 xml 文件 其中包含电视节目的所有剧集信息 它大小 38 kb 包含大约 680 个变量的属性和字符串 起初 我只是在 XMLTextReader 的帮助下阅读它 它在我的四
  • C++ 中的垃圾收集——为什么?

    我不断听到人们抱怨 C 没有垃圾回收功能 我还听说 C 标准委员会正在考虑将其添加到该语言中 恐怕我只是不明白它的意义 使用 RAII 和智能指针消除了它的需要 对吗 我唯一的垃圾收集经验是在几台廉价的八十年代家用计算机上 这意味着系统会时
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • C# 锁(mylocker) 不起作用

    我有很多 Web 服务调用 异步 在回调中 我会将结果绘制到 Excel 中 我想同步绘图方法 所以我使用以下内容 但是 从我在 Visual Studio 中追踪到 每次 lock locker 都会成功 并且有许多线程运行clearco
  • Webworker-threads:在工作线程中使用“require”可以吗?

    使用 Sails js 我正在测试 webworker threads https www npmjs com package webworker threads https www npmjs com package webworker
  • C++11 中引入了哪些重大更改?

    我知道 C 11 中至少有一项更改会导致一些旧代码停止编译 引入explicit operator bool 在标准库中 替换旧实例operator void 诚然 这将破坏的代码可能是一开始就不应该有效的代码 但它仍然是一个破坏性的变化
  • 如何删除可变参数模板的最后一个参数

    我有以下结构 我想从中删除最后一个参数index sequence template lt std size t values gt struct index sequence I need something like template
  • gcc 的 std::bind 在源代码中的哪个位置将参数复制到数据结构中?

    在试图了解在什么情况下std bind分配内存 我看了这个答案 https stackoverflow com a 25403584 391161 这给出了一些直觉 但我想要更详细的理解 所以我去查看了源代码gcc 我正在检查以下源代码 h
  • Time 方法在另一个线程中执行并在超时时中止

    您好 我正在尝试异步运行方法 以便计算持续时间并在超过超时时取消该方法 我尝试使用异步和等待来实现这一点 但没有运气 也许我过度设计了这个 任何输入都会受到赞赏 应该注意的是 我无法更改接口 TheirInterface 因此得名 到目前为
  • 使用 WaitHandle.WaitAll 时是否可以对 ThreadPool 中的任务进行分组/隔离?

    我面临的情况如下 因为 ThreadPool 每个进程有 1 个实例 所以我的问题是方法 1 会在 3 秒后取消按方法 2 排队的任务 http请求进来 method 1 gets executed first ThreadPool Que

随机推荐

  • 如何删除 div 和页面顶部之间的空间?

    这可能已经被问过一百万零一次了 但如果有人能向我解释 div 的行为 我将不胜感激 我有一个容器 div 我将其对齐在页面的中心 页面的顶部和顶部之间有一个间隙 我希望它与页面顶部齐平 我假设有某种我需要删除的边距或填充 但我无法想象它可能
  • OSX Mac App Store:如何安装守护进程 shell 脚本

    我想为 Mac App Store 编写一个涉及安装守护程序的应用程序 守护进程可以是一个非常简单的 Hello World shell 脚本 可以是 Bourne shell 或 Python 它应该在每次机器启动时自动运行 我尝试使用安
  • 如何在谷歌应用程序引擎中的留言簿中的每个帖子下添加日期和时间

    这是代码 import cgi import datetime import wsgiref handlers from google appengine ext import db from google appengine api im
  • 单击按钮时一个片段到另一个片段

    我已经学会了如何在单击按钮时将片段活动从一个更改为另一个 所有都是片段活动 但现在我遇到了同一片段上多个按钮的问题 只有第一个按钮 id 有效 我有多个按钮 每个按钮都有不同的片段活动 需要帮忙 package com test fragm
  • 将特定标头添加到 bitbake wget fetcher

    我需要设置一个特定的标头以使用以下命令从资源中获取存档wgetfetcher 类似于 wget header PRIVATE ACCESS TOKEN blablablablabla https some resource 如何使用该获取器
  • 如何在 iOS Swift 中将数据数组回调到另一个 viewController

    在createCardVC中 我使用carbonKit库来显示标签栏 最初 使用静态数据加载的数据数组 但现在我尝试使用来自 webView javascript postMessage 的数据数组 当 createCardVC 加载时 第
  • C++11 递归可变参数模板

    我想了解递归可变参数模板是如何工作的 include
  • Java 中的“快速”整数幂

    简短回答 糟糕的基准测试方法 你可能认为我现在已经明白了 该问题被表述为 找到一种快速计算x y的方法 其中x和y是正整数 典型的 快速 算法如下所示 public long fastPower int x int y Replaced m
  • 并发修改异常[重复]

    这个问题在这里已经有答案了 我有一小段代码 它给了我并发修改异常 我无法理解为什么我不断收到它 即使我没有看到任何并发修改正在进行 import java util public class SomeClass public static
  • SQL Server 和 Firebase/PouchDB 同步

    我正在构建一个 Web 应用程序 客户端需要在离线状态下通过浏览器访问数据存储 我正在考虑使用 Firebase 或 PouchDB 数据库在应用程序内实现此目的 但是 对于后端 我使用 SQL Server 我可以将 Firebase P
  • HTML 或 CSS 中的“父级”是什么?

    我被介绍到以下代码 div Here is span a span element span which is blue as span elements are set to be div div class extra style co
  • 如何在打字稿中将 array.map 与元组一起使用?

    每当我使用array map对于元组 Typescript 将其推断为通用数组 例如 以下是简单 3x3 数独游戏的一些片段 const a Blank type Blank typeof type Cell number Blank ty
  • 当扩展复杂类型时混合继承吗?

    我的架构中有以下内容
  • 迭代日期范围(scala 方式)

    给定开始日期和结束日期 我想使用 foreach map 或类似函数按天迭代它 就像是 DateTime now to DateTime now 5 day by 1 day foreach println 我在用https github
  • 放置新的零会占用内存吗?

    我有以下代码 struct foo void bar foo d new d foo d 是否表达new d foo d 留下指向的对象d不变 更具体地说 如果类foo并且其中递归包含的所有对象都只有简单的复制构造函数 那么new d fo
  • SQL 条件求和

    我目前有一个大型 SQL 语句 我将以下行添加到其中 以便获取每个交易 ID 的总现金 这是唯一的 select sum cash from Table a where a branch p branch and a transID p t
  • 视频流和 Android

    今天 对于我的一个应用程序 Android 2 1 我想从 URL 流式传输视频 就我探索的 Android SDK 而言 它非常好 我很喜欢almost它的每一个部分 但现在谈到视频流 我有点迷失了 如果您需要有关 Android SDK
  • Java 将 JFrame 附加到正在运行的应用程序窗口?

    如何将右上角的 JFrame 连接到另一个应用程序打开的窗口并在调整大小时保持不变 是否可以 这是我想要完成的任务的图表 谢谢您的帮助 如果这不可能 有其他选择吗 获取窗口大小 位置并相应设置我自己的 jframe 的方法 您要求 Java
  • 在具有不同 x-y 轴的面中绘制多个矩阵

    我从一组在线论坛收集了数据 并想使用 ggplot 和facets 每个论坛一个facet 绘制代表用户 A 回复用户 B 次数的矩阵 这是加载玩具示例的代码 library ggplot2 library dplyr df edges l
  • 互斥量在繁忙时被破坏

    EventHandler类有一个单例对象来接收来自主线程的事件 它将输入注册到向量 并创建一个运行 lambda 函数的线程 该函数在从向量中删除输入之前等待一段时间 以防止在一段时间内重复执行该输入的事件 但我在繁忙错误时遇到互斥体被破坏