2017-06-23 314 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很高兴听到你解决了它。建议的话,在多线程编程时要非常谨慎。竞争条件可能会发生,可能不会暴露该错误 - 直到它发生。 –

相关问题