2017-06-23 8 views
-1

Recordという関数の中で、スレッドを作成します。スレッド関数をThreadFnとしましょう。 ThreadFnの先頭から始まるThreadFnのコードブロックが完了するまで、Recordが待機するようにします。 どうすればいいですか?私はミューテックスで試しています。しかし、CreateMutexをどこに置くべきか、そしてReleaseMutexをどこに置くべきかはわかりません。あるスレッドが別のスレッドの一部を終了するのを待たせる方法は?

私は以下を試みました。しかし、それは動作していません。その後、最初のコードブロックが終了した

ghMutex = CreateMutex(NULL, FALSE, NULL); 

で 、

ReleaseMutex(ghMutex); 

インサイド録音:

Create the thread 
WaitForSingleObject(ghMutex, INFINITE); 
Close thread handle 
CloseHandle(ghMutex); 
グローバル変数

HANDLE ghMutex = NULL; 

インサイドThreadFnを持って

+0

動作しません。発信者は待っていません。 – Avinash

+2

devsはミューテックスを誤って使用しようとしているのはなぜですか?他のスレッドに信号を送る場合は、適切なシンクロオブジェクトを使用します。 'イベント'や 'セマフォ'を探します。どちらがあなたが望むように見えるかを行います。ミューテックスは、これに使用する間違ったオブジェクトです。 – ThingyWotsit

+1

@ThingyWotsitなぜあなたは控えるべきですか?彼は明らかに、この理由を理由にこの質問を投稿している。彼は単にミューテックスを使用することに限定されているか、「イベント」および/または「セマフォー」について知らなかった。 –

答えて

1

これにはcvを使うことができます。何が起こるCondition Variable

mutex m; 
bool ready = false; 
condition_variable cv; 

Record() { 
    //some code 

    //create thread 
    createThread(Threadfn()); 


    //get the lock 
    m.lock(); 
    //waits until it gets a signal call  
    while (!ready) cv.wait(m); 

    //continues code 
} 

Threadfn() { 

    //get the lock 
    m.lock(); 

    // run code 

    // tell Record that it can continue again 
    ready = true; 
    m.unlock(); 
    cv.notify_one(); 

} 

Record()がミューテックスをロックし、それがThreadfn()によって知らされるまでwhile (!ready) cv.wait(lck)でハングです。

+0

OPはWindowsを使用していますが、すべてのWindowsバージョンで条件変数がサポートされているわけではありません。 – ThingyWotsit

+0

ゲイリー、私はcondition_variableを認識していません。私はそれについて読むでしょう。しかし、その間にミューテックスとイベントについて詳しく読んで、今投稿した問題を解決することができました。ありがとう。 – Avinash

+0

@Avinashあなたはそれが解決したと聞いてうれしいです。しかし、アドバイスの言葉では、マルチスレッドプログラミングに関しては非常に慎重であるべきです。バグを公開しない限り、バグを公開しない可能性がある競合状態が発生する可能性があります。 –

関連する問題