0
我已閱讀過有關在任意CPU上使用C++可能不安全的重複檢查的文章。我不太確定我的代碼是否絕對安全。 類數據庫表示數據庫文件,並在需要時動態創建連接。 Database :: GetConnection可以同時從不同的線程中調用。如果代碼不是絕對安全的,我該如何修改代碼。謝謝。這段代碼是否是線程安全的C++
#include <mutex>
#include "sqlite3.h"
class Connection
{
private:
sqlite3* _handle;
std::string _path;
public:
Connection(const std::string& path) : _path(path) {
sqlite3_open(_path.c_str(), &_handle);
// some other initialization work..
}
}
class Database
{
private:
typedef enum
{
Void,
Connected,
// some other status...
} Status;
std::string _path;
std::mutex _mutex;
Status _status;
Connection* _connection;
void OpenDatabase()
{
_connection = new Connection(_path);
_status = Connected;
}
public:
Connection* GetConnection()
{
if (_status == Connected)
return _connection;
std::lock_guard<std::mutex> guard(_mutex);
if (_status != Connected)
OpenDatabase();
return _connection;
}
public:
Database(const std::string& path) : _path(path), _status(Void) {};
};
權威答案的信息不足,但看起來像這不是線程安全的。對我來說很明顯,'_connection'和'_status'只能在保護互斥體上鎖定時才能訪問。但是,情況顯然不是這樣。 –
你不守護'_status',你爲什麼認爲它是安全的? – Tas
我會盡管OpenDatabse返回連接,而不是它在類變量上運行。也許你需要的是一個單身人士? - http://stackoverflow.com/a/1008289/429476 –