簡體   English   中英

StringHashTable中使用的靜態函數線程安全?

[英]an static function used in StringHashTable thread-safe?

我有一個StringHashTable類
http://preshing.com/20110603/hash-table-performance-tests/

以下是部分來源:

class StringHashTable
{
    static uint fnv1Hash(const char *key)
    {
        unsigned int hash = 2166136261ul;
        for (const char *s = key; *s; s++)
            hash = (16777619 * hash) ^ (*s);
        return hash;
    };

    uint &operator[](const char *key)
    {
        uint hash = fnv1Hash(key) & (m_tableSize - 1);
        Bucket *firstBucket = m_table + hash;
        Bucket *b = firstBucket;
        if (b->key)
        {
            do
            {
                if (strcmp(b->key, key) == 0)
                    return b->value;// Found existing bucket
                b = b->next;
            } while (b);
        }
        ..........
    }
} 

假設我有全局變量:

StringHashTable hashtable(1024) ; //m_tableSize now 1024

然后主要是以下內容:

hashtable["0000"] = 0 ;
....
hashtable["9999"] = 9999 ;

填寫完我需要的所有數據后,線程1至n將根據鍵獲取值

while(1)
{
    s = get(); //return string like "0000" ... "9999"
    echo << hashtable[s.c_str()] << endl ;
}

我不知道StringHashTable首先是否可以在線程中正常工作,因為函數fnv1Hash是靜態的,再考慮一下,此StringHashTable中沒有靜態成員數據,因此當thread1在執行hashtable [“ 0000”]而thread2在執行hashtable時[“ 9999”]同時兩個thread1都調用fnv1Hash,它們都將返回正確的哈希!

我的問題是:同時使用不同密鑰的不同線程調用靜態uint fnv1Hash(const char * key)仍然可以正常工作嗎? 在StringHashTable中,由於任何原因fnv1Hash是靜態的?

函數fnv1Hash()除了key指向的數據之外,不訪問任何非本地狀態。 假設數組key指向的內容不是同時寫入的,則不存在線程問題。 當然,如果另一個線程寫入key指向的數組,則所有選擇都將關閉。

鑒於fnv1Hash()確實訪問了對象的任何數據,因此不需要this指針。 因此,將其static地向人類讀者和編譯器指示不會隱式訪問對象。 對於編譯器,結果是它不需要傳遞this指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM