初期化のために特定の API を 1 回だけ呼び出す必要がある場合があります。その後、スレッドは他のメソッドを呼び出すことができます。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 を受信しました」で失敗します。これは、初期化が完了していないか、initComplete が 0 である前に後続のメソッドを実行したためです。他の各スレッドのログには、「Before, initComplete = 0 " を最後の行にします。これらの変数を static volatile として定義したので、
initOnlyOnce = 1
最初のスレッドがそれを呼び出した直後に、その後このコード ブロックが再び入力されることはありません。ただし、Vugen はスレッドと同じではないようです。各 vuser_init.c は実行中の他の Vugen から独立しているため、変数は static volatile と宣言されていますが、状態は共有されません。
回避策はありますか? 基本的に、vuser_init の前身となるシングルトンが必要です。