статическая функция, используемая в StringHashTable поточно-ориентированной?

0

У меня есть класс 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 статичен по любой причине?!

  • 0
    В вашем сценарии данные читаются только одновременно, а не изменяются. Я не вижу проблем с безопасностью ниток. fnv1Hash частности, fnv1Hash вообще не имеет доступа к общим данным. В любом случае ключевое слово static не имеет ничего общего с потоками - не понятно, почему вы так зациклены на нем.
  • 0
    Это потокобезопасно до тех пор, пока ввод (т. Е. key ) является локальной переменной у вызывающей стороны, что означает не глобальный и не статический. локальные переменные расположены в стеке, и каждый поток имеет свой собственный стек.
Показать ещё 2 комментария
Теги:
thread-safety
hash
static

1 ответ

1
Лучший ответ

Функция fnv1Hash() не получает доступ к нелокальному состоянию, кроме данных, на которые указывает key. Предполагая, что содержимое key точек массива не записывается одновременно, нет проблемы с потоками. Конечно, если другой поток записывается в массив, на который указывает key, все ставки отключены.

Учитывая, что fnv1Hash() делает доступ к любой из данных объекта, ему не нужен this указатель. Таким образом, он static чтобы указать как читателю, так и компилятору, что объекты не будут доступны неявно. Для компилятора результат заключается в том, что ему не нужно передавать this указатель.

  • 0
    спасибо, можно спросить, что за статика в функции fnv1Hash? Я не могу видеть, если fnv1Hash статический или нет, будет иметь какое-либо значение в классе StringHashTable.
  • 0
    static член не получает неявный объект, то есть this указатель отсутствует. Это похоже на функцию, не являющуюся членом, но с доступом к private и protected членам класса, членом которого она является (хотя другой вопрос, и на один уже ответили ).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню