2017-06-23 313 views
-1

在一個名爲Record的函數中,我創建了一個線程。讓線程函數被稱爲ThreadFn。 我希望Record等待,直到從ThreadFn開始的ThreadFn中的一段代碼完成。 我該怎麼做?我一直在與互斥體一起嘗試。但我不確定將CreateMutex放到哪裏以及放置ReleaseMutex的位置。如何讓一個線程等待另一個線程的一部分完成?

我嘗試以下。但它不起作用。 有一個全局變量

HANDLE ghMutex = NULL; 

內ThreadFn: 起初

ghMutex = CreateMutex(NULL, FALSE, NULL); 

當代碼塊已經完成,然後

ReleaseMutex(ghMutex); 

內錄:

Create the thread 
WaitForSingleObject(ghMutex, INFINITE); 
Close thread handle 
CloseHandle(ghMutex); 
+0

不工作。來電者不在等待。 – Avinash

+2

爲什麼開發者不斷嘗試誤用互斥?如果要發信號通知其他線程,請使用適當的同步對象。查看'Event'和/或'Semaphore'。要麼會做你看起來想要的。一個互斥對象就是這個錯誤的對象。 – 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很高興聽到你解決了它。建議的話,在多線程編程時要非常謹慎。競爭條件可能會發生,可能不會暴露該錯誤 - 直到它發生。 –

相關問題