gpt4 book ai didi

c++ SIGABRT在多线程应用程序的结构析构函数中

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:37 28 4
gpt4 key购买 nike

我需要帮助解决当今的多线程谜团。

我有一个有调解器的应用程序,比如:

class Mediator{
ConfigMgr * mgr;
....
Config getConfig(){
return mgr->getConfig();
};
};

ConfigMgr 已正确初始化,没有任何问题。它由一个 Config 蓝图组成,它是一个具有一些 bool 值和 std::strings 的结构:

struct Config{
std::string param1;
std::string param2;
....
}

class ConfigMgr {
Config blueprint;

Config getConfig(){
Lock l(mtx); //wrapper on POSIX mutex and lock, works as expected
refreshConfig(); // some stuff that might alter Config blueprint
return config;
}

}

最后,我有多个工作线程,偶尔可能需要调用mediator->getConfig().param1;

问题是我的应用程序时不时地因 SIGABRT 而崩溃。据我所知,它在 Config 的析构函数中两次删除字符串时崩溃:配置::~配置()该结构没有我编写的方法。

我无法追踪根本原因。我的 Config 结构总是通过拷贝而不是引用传递。我认为自从调用 ConfigMgr::getConfig() 以来,每个线程都应该有自己的 Config 拷贝。这种结构应该是线程安全的,但显然存在某种竞争条件。你们有什么建议吗?

最佳答案

我被这个击中了。需要记住的重要事项是:

  1. std::string 在复制时共享其 char* 缓冲区。
  2. std::string 不是为多线程设计的。

因此,您在尝试删除同一个缓冲区时遇到了不同线程中的多个 std::strings,它们认为由于引用计数变量未正确更新而应该删除。

您可能必须更明确地说明所需的字符串拷贝,并为 Config 对象定义一个复制构造函数。

关于c++ SIGABRT在多线程应用程序的结构析构函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935620/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com