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