У меня есть класс 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 ["0000"], а thread2 делает хэш-таблицу ["9999"] в то же самое время оба потока1 вызывают fnv1Hash, они оба получат правильный хеш, возвращенный !!!
Мой вопрос: другой вызов потока static uint fnv1Hash (const char * key) с другим ключом в то же самое время все еще работает нормально? В StringHashTable, fnv1Hash статичен по любой причине?!
Функция fnv1Hash()
не получает доступ к нелокальному состоянию, кроме данных, на которые указывает key
. Предполагая, что содержимое key
точек массива не записывается одновременно, нет проблемы с потоками. Конечно, если другой поток записывается в массив, на который указывает key
, все ставки отключены.
Учитывая, что fnv1Hash()
делает доступ к любой из данных объекта, ему не нужен this
указатель. Таким образом, он static
чтобы указать как читателю, так и компилятору, что объекты не будут доступны неявно. Для компилятора результат заключается в том, что ему не нужно передавать this
указатель.
static
член не получает неявный объект, то есть this
указатель отсутствует. Это похоже на функцию, не являющуюся членом, но с доступом к private
и protected
членам класса, членом которого она является (хотя другой вопрос, и на один уже ответили ).
fnv1Hash
частности,fnv1Hash
вообще не имеет доступа к общим данным. В любом случае ключевое словоstatic
не имеет ничего общего с потоками - не понятно, почему вы так зациклены на нем.key
) является локальной переменной у вызывающей стороны, что означает не глобальный и не статический. локальные переменные расположены в стеке, и каждый поток имеет свой собственный стек.