У меня есть случай, когда конкретный API нужно вызывать только один раз для инициализации. После этого потоки могут вызывать другие методы. В vuser_init.c, у меня есть это:Можно ли инициализировать Loadrunner Vuser как singleton?
static volatile int initOnlyOnce = 0;
static volatile int initComplete = 0;
int iStatus;
if (1!=initOnlyOnce) {
initOnlyOnce =1;
lr_output_message("Before, initComplete = %d", initComplete);
iStatus = Initialize(); // product API call
initComplete = 1;
lr_output_message("After, initComplete = %d", initComplete);
if (1 != iStatus) {
lr_error_message("Initialize returns %d on %s.",iStatus,szLoadGenerator);
srand(time(NULL));
}
}
При запуске сценария, первый поток печатает оба, т.е.
Before, initComplete = 0
следует
After, initComplete = 1
и остальное тест выполняется в этой ветке, правильно. Однако следующий поток выходит из строя с ошибкой «Ошибка - память: Исключение ACCESS_VIOLATION получено», потому что он выполнил последующий метод без завершения инициализации или initComplete равен 0. Журналы для каждого из других потоков имеют «Before, initComplete = 0 "в качестве последней строки. Так как я определил эти переменные как статические, летучий, я ожидал, что
initOnlyOnce = 1
сразу после того, как первый поток называют его и в дальнейшем этот блок кода не будет введен снова. Однако, похоже, что Vugen не то же самое, что нить. Каждый vuser_init.c не зависит от других запусков Vugens, поэтому состояние не является общим, хотя переменные объявляются статическими волатильными.
Есть ли обходной путь? По сути, я хочу, чтобы одиночный предшественник vuser_init.
Спасибо за подсказку. Я создал две группы и добавил их к сценарию на контроллере. Для инициализации я назначил 1% vusers (1 из 100), а остальное для фактического прогона. Когда я запускаю его таким образом, я получаю сообщение о том, что какая-то функция отсутствует во второй группе, что вызывает недоумение. Но, умный ли LR сначала запустить мою группу init, а затем следующую? – Jai
Вы можете добавить свой собственный init перед инициализацией vuser. Кроме того, вы можете добавить логику, чтобы запускать ее только для одного пользователя на основе номера виртуального пользователя. –