在线程中使用 std::string 函数是不是安全? (c++)

Posted

技术标签:

【中文标题】在线程中使用 std::string 函数是不是安全? (c++)【英文标题】:is it safe to use std::string functions in a thread? (c++)在线程中使用 std::string 函数是否安全? (c++) 【发布时间】:2019-10-05 13:11:53 【问题描述】:

我想在 dll 中创建一个线程来发出一些 Web 请求。在线程中,我现在使用 std::sting 函数(c_str()、at()、find()、substr())和(string + string)。我知道线程异步运行,而且我发现如果我同时调用 1 个函数 2 次(1 个来自主程序,1 个来自线程)会导致问题/崩溃,我猜是因为两者都使用相同的内存?

所以现在如果我非常快地执行许多 Web 请求,我有时会崩溃。我认为这是因为同时使用 2 次 std::string 函数。 另外,如果这可能是导致问题的原因,我还有其他方法可以用于这项工作吗?

【问题讨论】:

有一些源自 C 库的 C 风格字符串函数,例如 std::strtok,它们有一个内部静态变量,用于在调用之间保持状态。维护自己内部状态的函数不是线程安全的。 std::string 中的所有函数都是线程安全的。然而,使用多线程,你还有很多其他的方法可以让你自食其果。这可能会或可能不会显示在这些函数中,但肯定不是由它们引起的。如果您需要有关代码的建议,请考虑 codereview.stackexchange.com,或者,如果您知道它有问题,请提取 minimal reproducible example 并在此处发布。作为新用户,也可以使用tour 并阅读How to Ask。 【参考方案1】:

您是否在两个线程之间共享相同的std::string object?如果是这样(并且该对象正在被一个线程修改而另一个线程也在尝试使用它),那将导致未定义的行为,除非您使用某种形式的同步来保护这些访问(例如 mutex em>)。

如果 OTOH 两个线程都在各自独立/私有的 std::string 对象上运行,则不会导致问题。

【讨论】:

以上是关于在线程中使用 std::string 函数是不是安全? (c++)的主要内容,如果未能解决你的问题,请参考以下文章

管理线程之向线程函数传递參数

使用 gcc 4.3 时 std::string 是线程安全的吗?

我可以在 IOCP WSARecv 函数中使用 std::string 吗?

将函数参数 `const char*` 转换为 `std::string_view` 是不是安全?

将`char []`传递给接受`std :: string&`的函数是不是是一种好习惯

std::atomic<std::string> 是不是正常工作?