StringHashTable 线程安全中使用的静态函数

an static function used in StringHashTable thread-safe?

本文关键字:静态函数 线程 安全 StringHashTable      更新时间:2023-10-16

我有一个 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 ;
}

我想知道字符串哈希表一开始是否可以在线程中正常工作,因为函数fnv1Hash是静态的,所以转念一想,没有这个字符串哈希表中的静态成员数据,所以当线程 1 正在做hashtable["0000"] 和 thread2 同时在做 hashtable["9999"]两个线程 1 都在调用 fnv1Hash,它们都将得到返回的正确哈希!!

我的问题是:不同的线程调用静态uint fnv1Hash(const char *key)同时不同的键仍然工作正常? 在 StringHashTable 中,fnv1Hash出于任何原因都是静态的?!

函数fnv1Hash()除了key指向的数据之外,不访问任何非本地状态。假设key指向的数组的内容不是同时写入的,则不存在线程问题。当然,如果另一个线程写入 key 指向的数组,则所有赌注都关闭。

鉴于fnv1Hash()确实访问对象的任何数据,它不需要this指针。因此,它static向人类读者和编译器指示对象不会被隐式访问。对于编译器来说,结果是它不需要传递this指针。