Я пишу числовую программу, которая должна быть несколько быстрой, а также многопоточной. У меня есть класс, который представляет число, и я хочу использовать в нем генератор случайных чисел. Теперь мне не нужно, чтобы мой ГСЧ был истинным ГСЧ, мне просто нужно, чтобы он генерировал целые числа с равномерным распределением между 0 и NMAX.
Итак, у меня есть в классе:
// use just an int here and forget about multithreading.
static uint32 rand = NMAX/4;
// this will be called multithreadedly
static uint32 GetRand() { return rand = ( rand + 1 ) % NMAX; }
Теперь, в однопоточном мире, это совершенно нормально для моих целей.
Поскольку это многопоточность, я предполагаю , что единственно возможная плохая вещь, которая может произойти, это то, что время от времени (например, <1% времени) обновление сбрасывается. Это означает, что два потока читают rand, обновляют его в регистре, возвращают обновленное значение, а затем записывают его дважды с одним и тем же значением. Это совершенно нормально. </p>
Мой вопрос: может ли быть что-нибудь хуже этого? Я полностью согласен с каждым потоком, использующим собственную переменную rand
, но это просто огромная боль, чтобы это произошло. Что я определенно не могу сделать, так это сделать так, чтобы каждый экземпляр класса использовал свою собственную переменную rand, поскольку это потребовало бы слишком много памяти.
UPDATE:
Итак, почему я хочу это сделать? Полная история - это класс с плавающей запятой, который использует 1 или 2 байта. Так что это должно быть быстро и так, и это кажется лучшим способом. На самом деле, я думаю, что я обновлю его с ( rand + 1 ) % NMAX
до чего-то вроде ( rand + [some prime] ) % NMAX
, так как он, кажется, работает лучше. Это пример одного из тех случаев, когда более надежное решение потребовало бы большего количества кода, сделало бы вещи менее общими и более зависимыми, сделало бы код менее понятным и легче разбить, и все для идеи, что «должна использоваться правильная синхронизация» ,
В основном меня беспокоит какая-то странная оптимизация, которую может выполнить компилятор, чтобы обновление rand не просто сбрасывалось, а rand становилось полным мусором. Теперь, когда я думаю об этом, , даже если будет в порядке (способ использования этого числа), так как при следующем использовании GetRand все равно будет% NMAX, ошибка будет вызывать не более одного использования GetRand находиться вне заданного диапазона [0, NMAX). Спасибо за любые ответы.