C++(VC++6.0)でのマルチスレッドなコードは排他とかを書くのが面倒くさい。

// オリジナルのfoo()。(スレッドセーフで無いと思ってください)
int foo0( int i ) {
    if( i == 0 ) {
        return -1; // エラーリターン
    } else if( i < 0 ) {
        throw e; // 例外を投げる
    }
    return var( i ); // 他の関数に委譲する
}

// スレッドセーフ版(sObjectという共通リソースがあるとする)
// sObject用のmutexを、どこか外部で作る。
HANDLE sObjectMutex = CreateMutex( NULL,FALSE,NULL );
int foo1( int i ) {
    WaitForSingleObject( sObjectMutex );//ロックをかける
    if( i == 0 ) {
        ReleaseMutex( sObjectMutex );//エラーリターンの前に、ロック解除
        return -1; // error return;
    } else if( i < 0 ) {
        ReleaseMutex( sObjectMutex );//例外を投げる前に、ロック解除
        throw e;
    }
    int result = var( i );//var() に委譲し、帰り値を保存
    ReleaseMutex( sObjectMutex );//リターンの前に、ロック解除
    return result;//保存したvar()の帰り値でリターン
}
// このコードは、どこか間違っているかい?