StringHashTable 线程安全中使用的静态函数
an static function used in StringHashTable thread-safe?
我有一个 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
指针。
相关文章:
- 非静态成员失败的线程调用函数
- 无效使用非静态成员函数 c++ 线程 linux
- 为什么这些静态函数没有按预期从另一个线程返回?
- 为什么有一个额外的 & 将非静态成员函数的地址传递给 C++ 中的线程?
- 类成员在构造函数(线程)之后更改地址
- C++函数中的多线程静态 POD 初始化
- C++ 线程函数指针实现返回错误无效使用非静态成员函数
- 函数作用域是静态变量还是线程本地变量在C++11中的第一个条目中初始化
- C++多线程:是本地静态lambda线程安全的初始化
- 构造函数在不同线程中的静态单例类上调用两次
- 线程错误:非静态成员函数的使用无效
- 如何使类静态变量线程安全
- C 静态与线程存储持续时间破坏顺序
- Qt库-静态成员函数的线程安全性
- C++无限依次运行两个函数(线程)
- 对于 c++11 之前的编译器,返回本地静态对象线程是否安全
- 是块作用域静态或线程存储持续时间变量初始化失败的原因
- c++将各种参数传递给父类构造函数(线程c++11)
- 指向对象初始化的静态指针——线程安全
- 本地静态的线程安全初始化:MSVC