c++ - STL 字符串中止的析构函数
问题描述
我有一个多线程程序,我忘了使用互斥锁。有一次,程序因以下堆栈跟踪而中止:
T abort
T __libc_message
t malloc_printerr
T free
T operator delete(void*)
W std::basic_string<char, std::char_traits<char>, std::allocator<char>>::~basic_string()`
我使用了 gnu c++ 编译器 4.4.3(在 Ubuntu 10.04 上)。是真的吗,这种行为可能是因为使用了如下示例中的字符串。实际上它要复杂得多,但我想知道下面的简单代码是否会导致这种中止。
调用复制字符串的析构函数时中止的线程:
void f() { std::string s = someglobalstring; }
修改字符串的线程:
void g() { someglobalstring = newcontent; }
问题:较新的 C++ 实现在读取和写入 std::string 时线程安全吗?预计析构函数在这里中止吗?
解决方案
字符串不是线程安全的。如果要执行此操作,std::mutex
请在访问字符串时使用 a。
void g()
{
std::lock_guard<std::mutex> lock(m);
someglobalstring = newcontent;
}
f 相同,并用字符串定义m
(type )。std::mutex
推荐阅读
- c# - ClickOnce VSTO CommonLanguageRuntime
- flutter - 如何使用 Provider 将文本导航到一个小部件而不是同时导航到屏幕上的所有小部件?
- javascript - 将焦点从一列移动到表格的另一列时如何调用javascript函数
- python - “阵列的切痕太多”
- python - Python - 压缩数据帧中跨行的 TO 和 FROM 值范围的集合
- cplex - 没有将带有新数据集的 CPLEX OPL 模型的结果写回 excel
- ios - 当你在 Swift 的同步队列中异步调度任务时会发生什么?
- java - 如何通过读取文件获取以空格分隔的字符串流?
- google-apps-script - 将消息从 Telegram 组发送到特定成员 ID 到 Google 表格
- c# - 如何沿 Y 轴抬起播放器?