我有一个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指针。

10-01 01:55