LabWindows/CVI で「Volatile」キーワードは、何に使うのですか?



使用ソフトウェア:
使用ソフトウェア・バージョン: N/A
使用ソフトウェア・バージョンに特化: N/A
二次のソフトウェア: N/A

問題: CVI でマルチスレッドのアプリケーションを開発しているのですが、「Volatile」キーワードを頻繁に見かけます。スレッド関数内で使用するグローバル変数を宣言するとき、なぜ「Volatile」キーワードを付ける必要があるのですか。

解決策: 「Volatile」キーワードは、変数の最新の値が必ず参照されるように保証してくれます。
これはマルチスレッドのアプリケーションでは非常に重要です。というのも、複数の異なるスレッドが、ほぼ同時に一つの変数にアクセスする可能性があるからです。あるスレッドが変数の値を変更したにも関わらず、次のスレッドがアクセスするまでに更新されないかも知れません。そこで「Volatile」キーワードが役に立ちます。変数を「Volatile」として宣言すると、変数値は変更直後に更新されます。以下に簡単な例を示します。


static volatile int exiting = 0;

int CVICALLBACK Quit (int panel, int control, int event, void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
/* When we quit our program, we first set our exiting variable to 1 */
exiting = 1;
CmtDiscardThreadPool (poolHandle);
QuitUserInterface (0);
break;
}
return 0;
}

/* This is the function that is running in the thread */

static int CVICALLBACK MyThreadFunction (void *ctrlID)
{
int threadCount = 0;
/* When the Quit callback function above quits, this "exiting" variable is immediately updated, thereby causing this thread to cease */
while (!exiting) {
threadCount++;
SetCtrlVal (panelHandle, (int)ctrlID, threadCount);
Delay (0.0001);
}
return 0;
}

関連リンク:

添付:





報告日時: 10/03/2003
最終更新日: 08/06/2004
ドキュメントID: 322DK4Y1