c_str()在C++中的线程安全性

Cik*_*Cik 4 c++ multithreading stl

我创建了一个类SettingsClass,它包含静态字符串,用于保存MySQL C++连接器库使用的db连接字符串(例如hostname,dbname,username,password).

只要函数需要连接到数据库,它就会在这些静态字符串上调用.c_str()函数.例如:

Class SettingsClass
{
    public:
    static string hostname;
    ...
}SettingsClass;
string SettingsClass::hostname;

//A function that needs to connect to the DB uses:
driver = get_griver_instance();
driver->connect(SettingsClass.hostname.c_str(),...);
Run Code Online (Sandbox Code Playgroud)

静态字符串在进程生命周期中填充一次.其值从配置文件中读取.

我的应用程序是多线程的.我是否以安全的方式使用c_str()?

Mat*_*son 5

c_str()本身应该是线程安全的.但是,如果你有另一个访问(写入)你正在使用c_str()的字符串的线程,那么你正在玩一个坐在汽油池中的匹配.

通常c_str()是通过在现有字符串的末尾添加零值(空字符0x00,而不是0的字符,即0x30)来实现的(如果还没有那个),并传回where的地址字符串存储.

有兴趣的人可以在这里阅读libstdc ++代码: libstdc ++,basic_string.h 有趣的行是1802和294 - 1802是c_str()函数,294是c_str()调用的函数.

  • 第二段具有误导性.这不是`c_str()`正在做的事情.在成为一个"const"成员和要求以恒定时间返回"O(1)"之间,没有太多的余地来进行任何条件修改. (2认同)
  • 由于我概述的原因,这仍然是错误的.这不是**c_str()`的作用,也不知道**任何**实现会这样做. (2认同)