тут, к сожалению, проблема даже не в критических секциях, а проблема в очереди вызова random()
Да это всё понятно, что потоки вносят недетерминированность в работу программы.
Я к тому, что если есть потоки, и в них используется System.Random, то либо в них
уже задействованы критические секции и программист знает какие именно и как ему безопасно вызывать System.Random, либо его программа
уже нерабочая.
И в первом случае непонятно зачем ему вызывать System.Random, потому что если делать всё «по науке», то каждому потоку нужно иметь свой инстанс рандома, а в такой ситуации удобныей использовать не System.Random, а какой-то многопоточный. Можно выбрать тот, который воспроизводим, и который можно проинициализировать сидом при старте потока.
а зачем рандом? и если логи всё-равно ведутся, то может быть записывать результат рандом-а, а не seed?
Ну вот есть у меня, например, такая функция
- Код: Выделить всё
function Rand2f(L, R, B, T: TFloat): TVec2f;
begin
Result.X := Random * (R - L) + L;
Result.Y := Random * (T - B) + B;
end;
Где в программе логгировать? Впендюривать прямо в Rand2f, общую корневую функцию, ничего знать не знающую о рандомах, логгировании и прочем, или везде бегать и вставлять в месте вызова этой Rand2f сохранялку TVec2f, делающую репродукцию реальных результатов Random'ов? Точно ли я везде всё в программе залоггировал, как убедиться? А если есть RandRect2f, то, наверное, логирование нужно будет впендюривать не в общую корневую функцию RandRect2f, а в места её вызова. Не забыл ли я заодно про Rand3f и Rand2i? TList.Shuffle и TArray.Shuffle я учёл? Везде ли я подменил Random на свой, даже в чужих библиотеках? Вот я хочу заюзать библиотеку VasyaPupkin у себя в проекте — надо бы прочекать как там обстоят дела с Random'ами, вдруг она, о боже, их использует? Что будет, если я захочу оторвать всё это безобразие от программы, так как оно мне просто надоело, сколько усилий я затрачу на отрывание? Вдруг Rand2f в программе будет дёргать 10000 раз в секунду, прога не гикнется от такого количества записий в файл? Надо бы замерить «Random Rate», чтобы знать в каких ситуациях можно будет использовать такое логгирование.
Я это к чему. На словах-то это просто звучит «не seed сохранять, а результаты», а на деле поддержка кода усложняется лавинообразно.