2016-05-15 6 views
0

通常、スレッドセーフな関数を作成したいときは、共有データをロックし、作業が終了したら解放します。C:この関数をスレッドセーフにするには?

ここで私はグローバル変数を扱っています。ロックとロック解除だけでは、関数が一意の値を返すことはありません。次の関数をスレッドセーフに変更し、常に一意の整数を返すようにするにはどうすればよいですか?

int count = 0; 
int GetUnique() 
    { 
    count = count + 1; 
    return count; 
    } 

ローカル静的変数を関数内に記述する人がいますか?どのように、なぜこれが機能するのですか?

+1

この関数は 'count'を返す必要はありません。 'int local_count;ロック();カウント=カウント+ 1; local_count = count; unlock(); return local_count; '? –

+1

@iharob - ロック/アンロックは過度であり、CPUはロックを一切持たずにこの正確なユースケースを処理するための具体的な指示を持っています。 – Geoffrey

+0

@Geoffrey私はこれが宿題のように見えるか、そうでないと思われるので、これが必要であると仮定しています。 –

答えて

4

GCC組み込み関数を使用している場合、この場合はアトミックインクリメントを使用し、ロックやmutexは必要ありません。 __sync_add_and_fetchは、ここで探しているもの、またはVC InterlockedIncrementが同じものを実行します。

次にこのコードの移植を行うことができます

#ifdef _WIN32 
#define SYNC_ADD_AND_FETCH(x) InterlockedIncrement(&(x)) 
#else 
#define SYNC_ADD_AND_FETCH(x) __sync_add_and_fetch(&(x), 1) 
#endif 

int main(int argc, char *argv[]) 
{ 
    int v = 0; 
    SYNC_ADD_AND_FETCH(v); 
    printf("%d\n", v); 
} 

はそれが静的作り、実際にそれがどのような方法で解決しない、その場でそれを修正する他のスレッドからの変数を保護するのに十分ではありません。

+1

"*には足りない*"? 'static'はまったく助けません。 – alk

+0

^^^ @alkは言っています。マルチスレッドのアプリケーションのライブラリでは「静的」なのですが、通常は全く悲惨です。 –

+0

@マリンジェームス - 原子操作が観察されない場合にのみ、災害が発生します。 – Geoffrey

関連する問題