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

时间:2014-12-26 03:49:47

标签: c++ hash static thread-safety

我有一个来自的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);
        }
        ..........
    }
} 

假设我有全局var:

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 [&#34; 0000&#34;]和thread2同时进行散列表[&#34; 9999&#34;] 两个thread1都调用fnv1Hash它们都会得到正确的哈希返回!!!

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

1 个答案:

答案 0 :(得分:1)

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

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