Russian Qt Forum
Октябрь 03, 2024, 01:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [решено] qrand() внутри потока  (Прочитано 12094 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Май 11, 2010, 19:50 »

хмм...что то я все равно не понял почему один раз нельзя!? можно еще раз?
Почему "нельзя"? Можно в зависимости от того что Вы хотите получить. По простому говоря, значение генератора случайных чисел копируется в приватные данные каждой нитки. Это хорошо, т.к. гарантирует воспроизводимость: qrand() в одной нитке не зависит от других. Если же не нравится что 2 и более ниток выдают те же числа - надо сделать srand() в самой нитке. Использовать привязки к таймеру - в этом случае получаем невоспроизводимость - могут быть разные результаты при 2 запусках одной программы. Это может быть желательно или нет. Если нужна воспроизводимость, то привязываться к this и.т.п - ненадежно. Лучше напр. так

Код
C++ (Qt)
uint NextSRand( void )
{
static uint theValue = 100;
static QMutex mutex;        // это должно быть static
QMutexLocker lock(&mutex);
return ++theValue;
}
 
// использование в нитке
qsrand(NextSRand());
 
« Последнее редактирование: Май 12, 2010, 11:39 от Igors » Записан
BRE
Гость
« Ответ #16 : Май 11, 2010, 19:53 »

Код
C++ (Qt)
uint NextSRand( void )
{
static uint theValue = 100;
QMutex mutex;
QMutexLocker lock(&mutex);
return ++theValue;
}
 

А что защищает локальный мьютекс? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Май 11, 2010, 19:55 »

А что защищает локальный мьютекс? Улыбающийся
theValue если (вдруг) 2 нитки полезут в NextSRand  Улыбающийся
Записан
BRE
Гость
« Ответ #18 : Май 11, 2010, 19:58 »

А что защищает локальный мьютекс? Улыбающийся
theValue если (вдруг) 2 нитки полезут в NextSRand  Улыбающийся
Локальный объект создается в стеке, сколько ниток вызовут эту функции, столько объектов и будут создано... и у каждой будет свой мьютекс, ничего не защищающий.  Подмигивающий
« Последнее редактирование: Май 11, 2010, 20:03 от BRE » Записан
ритт
Гость
« Ответ #19 : Май 12, 2010, 00:18 »

BRE: зачёт Улыбающийся

static QBasicAtomicInt theIdCounter = Q_BASIC_ATOMIC_INITIALIZER(1);
...
qsrand(theIdCounter.fetchAndAddRelaxed(1));

/* а это зачёт мне Улыбающийся */
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Май 12, 2010, 11:29 »

Локальный объект создается в стеке, сколько ниток вызовут эту функции, столько объектов и будут создано... и у каждой будет свой мьютекс, ничего не защищающий.  Подмигивающий
Верно, mutex также должен быть static, подправился  Улыбающийся  Хотя если напр. нитки могут создаваться в любом порядке для разных вычислений, предложенный вариант воспроизводимости не обеспечивает. Тогда лучше предвычислить значения для qsrand в главной нитке и передавать их создаваемым ниткам в конструкторах.
Записан
BRE
Гость
« Ответ #21 : Май 12, 2010, 11:52 »

Хотя если напр. нитки могут создаваться в любом порядке для разных вычислений...
Даже больше. При запуске сразу нескольких ниток, многие операционные системы не гарантируют порядок их запуска. Абсолютно спокойно первой может получить управление нитка запущенная второй по очереди... Соответственно можем получить очень трудно обнаруживаемую непонятку.  Улыбающийся
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 23.