Browse Source

refactor & feat: EnvVar添加互斥锁

SongZihuan 3 years ago
parent
commit
bde6b7d20f
3 changed files with 40 additions and 40 deletions
  1. 6 5
      include/core/env-var.h
  2. 2 1
      include/core/env-var.inline.h
  3. 32 34
      src/core/env-var.cpp

+ 6 - 5
include/core/env-var.h

@@ -1,9 +1,10 @@
 #ifndef AFUN_ENV_VAR_H
 #define AFUN_ENV_VAR_H
 #include <unordered_map>
+#include <thread>
+#include <mutex>
 #include "aFuntool.h"
 #include "aFunCoreExport.h"
-#include "shared_mutex"
 
 namespace aFuncore {
     class AFUN_CORE_EXPORT EnvVarSpace {  // 环境变量
@@ -13,9 +14,9 @@ namespace aFuncore {
         EnvVarSpace(const EnvVarSpace &)=delete;
         EnvVarSpace &operator=(const EnvVarSpace &)=delete;
 
-        [[nodiscard]] inline size_t getCount() const;
-        bool findString(const std::string &name, std::string &str) const;
-        bool findNumber(const std::string &name, int32_t &num) const;
+        [[nodiscard]] inline size_t getCount();
+        bool findString(const std::string &name, std::string &str);
+        bool findNumber(const std::string &name, int32_t &num);
 
         void setString(const std::string &name, const std::string &str);
         void setNumber(const std::string &name, int32_t num);
@@ -31,7 +32,7 @@ namespace aFuncore {
         };
 
         std::unordered_map<std::string, EnvVar> var;
-        std::shared_mutex lock;
+        std::mutex lock;
     };
 }
 

+ 2 - 1
include/core/env-var.inline.h

@@ -3,7 +3,8 @@
 #include "env-var.h"
 
 namespace aFuncore {
-    inline size_t EnvVarSpace::getCount() const{
+    inline size_t EnvVarSpace::getCount() {
+        std::unique_lock<std::mutex> mut(lock);
         return var.size();
     }
 }

+ 32 - 34
src/core/env-var.cpp

@@ -6,14 +6,13 @@ namespace aFuncore {
      * @param str 文本
      * @return 是否成功
      */
-    bool EnvVarSpace::findString(const std::string &name, std::string &str) const{
-        try {
-            auto &env_var = var.at(name);
-            str = env_var.str;
-            return true;
-        } catch (std::out_of_range &) {
+    bool EnvVarSpace::findString(const std::string &name, std::string &str) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             return false;
-        }
+        str = env_var->second.str;
+        return true;
     }
 
     /**
@@ -22,14 +21,13 @@ namespace aFuncore {
      * @param num 文本
      * @return 是否成功
      */
-    bool EnvVarSpace::findNumber(const std::string &name, int32_t &num) const{
-        try {
-            auto &env_var = var.at(name);
-            num = env_var.num;
-            return true;
-        } catch (std::out_of_range &) {
+    bool EnvVarSpace::findNumber(const std::string &name, int32_t &num) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             return false;
-        }
+        num = env_var->second.num;
+        return true;
     }
 
     /**
@@ -38,12 +36,12 @@ namespace aFuncore {
      * @param str 文本
      */
     void EnvVarSpace::setString(const std::string &name, const std::string &str){
-        try {
-            auto &env_var = var.at(name);
-            env_var.str = str;
-        } catch (std::out_of_range &) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             var.insert({name, {str, 0}});
-        }
+        else
+            env_var->second.str = str;
     }
 
     /**
@@ -52,12 +50,12 @@ namespace aFuncore {
      * @param num 数值
      */
     void EnvVarSpace::setNumber(const std::string &name, int32_t num){
-        try {
-            auto &env_var = var.at(name);
-            env_var.num = num;
-        } catch (std::out_of_range &) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             var.insert({name, {"", num}});
-        }
+        else
+            env_var->second.num = num;
     }
 
     /**
@@ -66,12 +64,12 @@ namespace aFuncore {
      * @param str 文本
      */
     void EnvVarSpace::addString(const std::string &name, const std::string &str){
-        try {
-            auto &env_var = var.at(name);
-            env_var.str += str;
-        } catch (std::out_of_range &) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             var.insert({name, {str, 0}});
-        }
+        else
+            env_var->second.str += str;
     }
 
     /**
@@ -80,11 +78,11 @@ namespace aFuncore {
      * @param num 数值
      */
     void EnvVarSpace::addNumber(const std::string &name, int32_t num){
-        try {
-            auto &env_var = var.at(name);
-            env_var.num += num;
-        } catch (std::out_of_range &) {
+        std::unique_lock<std::mutex> mut(lock);
+        auto env_var = var.find(name);
+        if (env_var == var.end())
             var.insert({name, {"", num}});
-        }
+        else
+            env_var->second.num += num;
     }
 }