私はこのようなものにするために関数内でstaticキーワードをうまく利用して、最大考えた:要するにマルチスレッドコンテキストで静的変数を初期化する方法は?
void threadSafeWrite(int *array, int writeIndex, int writeData){
static void *threadLock = Lock_create(); //in my code locks are void* to be cross-platform compatable
Lock_aquire(threadLock);
array[writeIndex] = writeData;
Lock_release(threadLock);
}
それがクリティカルセクションを作るために良い方法のように思えます。私の質問は、スレッドセーフな方法でthreadlockをどのように初期化するのですか?私が恐れる例の問題は、ロックが複数回割り当てられ、各スレッドが異なるロックを使用するということです。どのようにこれを修正するための任意のアイデア?鶏と卵の問題のようだ。私は、pthreadとwindowsスレッドの両方で動作する解決策(または解決策)が必要です。
EDIT:私がこの機能を望む理由は、デバッグ目的のためにシングルスレッドまたはマルチスレッドのコードを実行するときに違いがあるかどうかをテストする非侵入的な方法を提供するからです。
read_memory_barrierは、ロックによって暗示されているので必須ではありません。しかし、これは二重チェックされたロックイディオムであり、ほとんどのメモリモデルでは無効です。 2番目のスレッドは 'init_flag = 1'を参照するかもしれませんが、' data'やそれが指しているものの古い値があります。 – jilles
@jilles「ほとんどのメモリモデル」について私は知らない。 –
あなたはおそらくinit_dataを何回も呼び出す気にせず、その最終的な出来事で何かを捨てる準備ができていれば、CASでこれを行うことができ、ロックを避けることができます。 –