C++プログラムのVC++へのポート

何の因果かWindows上のVC++でプログラミングをしなければならなくなった.Javaはよく使っていたが,VC++を使うのは始めて.MSの処理系を使うのはMS-DOS 3のころMS-C 3.0を使ってバイトして以来だ.20数年も前の話.

いくつか引っかかったので,自分の為にメモ.

計時

Unix 系ではgettimeofdayを使う.VC++には遥かに高機能な時間関連クラスが用意されているようだが,gettimeofdayのセマンティクスに近いのは_ftime.gettimeofdayが(インターフェイスとしては)マイクロ秒単位で取得できるのに対して,_ftimeではミリ秒なので要注意.もっと解像度が高い情報が必要な場合には別のインターフェイスを使う必要があるだろう.epochからの秒数を浮動小数点で取得する例.まずはUNIX.

#include 

double 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という同じ構造体で表現されているようだ.

スレッド生成

pthreadではこんな感じ.

pthread_t thread;
pthread_create(&thread , NULL , worker, NULL

Windows ではこう.

HANDLE thread;
thread = (HANDLE)_beginthread(worker,0,NULL);

一つ注意しなければならないのが,スレッドのエントリポイントとなる関数(ここではworker) のシグネチャ.pthreadでは void * を返す関数として定義するのだが,Windowsでは void の関数となっていること.

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);

第三引数のフラグで,すべての終了をまつか,どれか一つでも終了したら返るかを選択できる.便利.

sleep

Unix では sleep, usleep, nanosleepを使うのが普通だと思う.WindowsではSleepという関数が用意されている.引数はミリ秒単位.

それにしても

なんかもっとどうにかならないのだろうか.こんな表面的な相違を個々のプログラマが吸収しなければならないなんて,どう考えても馬鹿げている.私の知らないハイレベルなライブラリがあって,それを使えば幸せになれる,なんてことだったりして?