在线程中使用 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` 是不是安全?