我有一个来自的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 因任何原因是静态的?!
答案 0 :(得分:1)
函数fnv1Hash()
不访问key
指向的数据以外的任何非本地状态。假设数组key
的内容不是同时写入的,则没有线程问题。当然,如果另一个线程写入key
所指向的数组,则所有投注均已关闭。
鉴于fnv1Hash()
确实访问了任何对象的数据,它不需要this
指针。因此,使static
向人类读者和编译器指示不会隐式访问对象。对于编译器来说,结果是它不需要传递this
指针。