这段代码是否是C ++的线程安全的

时间:2016-11-23 03:00:16

标签: c++ multithreading

我读过有关双重检查的文章,这些文章在任意CPU上使用C ++可能都不安全。我不太确定我的代码是否绝对安全。 类数据库表示数据库文件,并在需要时动态创建连接。可以同时从不同的线程调用Database :: GetConnection。如果代码不是绝对安全的,我该如何修改代码。谢谢。

Sys.Date() == "2016-11-23"
#[1] TRUE
Sys.Date() == as.Date("2016-11-23")
#[1] TRUE

1 个答案:

答案 0 :(得分:1)

  

为了提高效率...... 足够安全

您正在处理数据库,效率没有实际意义且足够安全取决于您

足够 意味着一定程度的允许不确定性。 还好吗?

如果 足够安全,有0.001%的可能性会发生什么?软件崩溃了吗?硬件是否爆炸?鸟儿会从里面翻过来从天而降吗?

如果您的OpenDatabase课程中的Database功能被锁定,那么删除第一项检查并将GetConnection功能保留为以下内容有什么问题:

Connection* GetConnection()
{
    std::lock_guard<std::mutex> guard(_mutex);
    if (_status != Connected)
        OpenDatabase();
    return _connection;
}

你正在处理一个数据库,所以你的CPU创建和存储std::lock_guard并锁定/解锁_mutex对象所需的几毫秒然后执行一个简单的布尔检查是非常微不足道的与构建数据库的连接和事务状态所需的100毫秒相比。

拯救鸟类。