我有一个案例,一个特定的 API 只需要调用一次来初始化。此后线程可以调用其他方法。在 vuser_init.c 中,我有这个:
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”而失败,因为它已执行后续方法而未完成 Initialize 或 initComplete 为 0。其他每个线程的日志具有“之前,initComplete = 0 " 作为最后一行。由于我已将这些变量定义为静态易失性,因此我希望
initOnlyOnce = 1
在第一个线程调用它之后立即不会再次输入此代码块。但是,似乎 Vugen 与线程不一样。每个 vuser_init.c 都独立于其他正在运行的 Vugens,因此尽管变量被声明为静态易失性,但状态不共享。
有解决方法吗?我本质上想要 vuser_init 的单例前体。