C++プログラムのVC++へのポート
何の因果かWindows上のVC++でプログラミングをしなければならなくなった.Javaはよく使っていたが,VC++を使うのは始めて.MSの処理系を使うのはMS-DOS 3のころMS-C 3.0を使ってバイトして以来だ.20数年も前の話.
いくつか引っかかったので,自分の為にメモ.
計時
Unix 系ではgettimeofdayを使う.VC++には遥かに高機能な時間関連クラスが用意されているようだが,gettimeofdayのセマンティクスに近いのは_ftime.gettimeofdayが(インターフェイスとしては)マイクロ秒単位で取得できるのに対して,_ftimeではミリ秒なので要注意.もっと解像度が高い情報が必要な場合には別のインターフェイスを使う必要があるだろう.epochからの秒数を浮動小数点で取得する例.まずはUNIX.
#includedouble result; struct timeval tv; gettimeofday(&tv, NULL); result = tv.tv_sec; result += (double)tv.tv_usec / 1000000.0;
Windowsではこんな感じ.
#include#include double result; _timeb tv; _ftime(&tv); result = (double)tv.time; result += (double)tv.millitm / 1000.0;
スレッド関連
UNIXではpthreadを使うのが一般的(だと信じてる).VC++にはこれまた,もっとハイレベルのクラスがあるようなのだが,pthread相当のインターフェイスを使ってみた.なぜか,threadとmutexがHANDLEという同じ構造体で表現されているようだ.
Mutex
pthreadではこんな感じ.
pthread_mutex_t lock; pthread_mutex_lock(&lock); .... pthread_mutex_unlock(&lock);
Windowsではこう.
HANDLE lock; lock = CreateMutex(NULL,FALSE,NULL); WaitForSingleObject(lock,INFINITE); .... ReleaseMutex(lock);
Thread のjoin
pthread では,
pthread_join(thread , NULL);
Windowsでは,
WaitForSingleObject(thread, TIMEOUT);
ちなみに,複数のスレッドを待つこともできる.
WaitForMultipleObject(numOfThreads, threads, FLAG, TIMEOUT);
第三引数のフラグで,すべての終了をまつか,どれか一つでも終了したら返るかを選択できる.便利.
それにしても
なんかもっとどうにかならないのだろうか.こんな表面的な相違を個々のプログラマが吸収しなければならないなんて,どう考えても馬鹿げている.私の知らないハイレベルなライブラリがあって,それを使えば幸せになれる,なんてことだったりして?