diff --git a/src/libgrand-search-daemon/utils/chineseletterhelper.cpp b/src/libgrand-search-daemon/utils/chineseletterhelper.cpp index 59613bec..d054d025 100644 --- a/src/libgrand-search-daemon/utils/chineseletterhelper.cpp +++ b/src/libgrand-search-daemon/utils/chineseletterhelper.cpp @@ -24,6 +24,8 @@ ChineseLetterHelper::ChineseLetterHelper() bool ChineseLetterHelper::chinese2Pinyin(const QString &words, QString &result) { + QReadLocker lk(&m_lock); + int ok = false; for (int i = 0; i < words.length(); ++i) { const uint key = words.at(i).unicode(); @@ -42,6 +44,13 @@ bool ChineseLetterHelper::chinese2Pinyin(const QString &words, QString &result) void ChineseLetterHelper::initDict() { + // fast check + if (m_inited) + return; + + QWriteLocker lk(&m_lock); + + // check again, m_inited may be setted to true in other thread. if (m_inited) return; diff --git a/src/libgrand-search-daemon/utils/chineseletterhelper.h b/src/libgrand-search-daemon/utils/chineseletterhelper.h index 8e0079fb..74b4b49e 100644 --- a/src/libgrand-search-daemon/utils/chineseletterhelper.h +++ b/src/libgrand-search-daemon/utils/chineseletterhelper.h @@ -7,6 +7,7 @@ #include #include +#include #define Ch2PyIns GrandSearch::ChineseLetterHelper::instance() @@ -24,6 +25,7 @@ class ChineseLetterHelper void initDict(); volatile bool m_inited = false; QHash m_dict; + QReadWriteLock m_lock; }; }