如何让一个线程等待另一个线程的一部分完成?
在一个名为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);
您可以使用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)
挂起。
请注意,OP使用的是Windows,并不是所有的Windows版本都支持条件变量(尽管我怀疑大多数(如果不是全部的话)当前支持的都是:)。 – ThingyWotsit
加里,我不知道condition_variable。我会阅读有关它。然而,与此同时,我阅读了更多有关互斥和事件的信息,现在我已经能够解决我发布的问题。谢谢。 – Avinash
@Avinash很高兴听到你解决了它。建议的话,在多线程编程时要非常谨慎。竞争条件可能会发生,可能不会暴露该错误 - 直到它发生。 –
不工作。来电者不在等待。 – Avinash
为什么开发者不断尝试误用互斥?如果要发信号通知其他线程,请使用适当的同步对象。查看'Event'和/或'Semaphore'。要么会做你看起来想要的。一个互斥对象就是这个错误的对象。 – ThingyWotsit
@ThingyWotsit为什么你必须居高临下?出于某种原因,他显然在这里张贴这个问题。要么他只限于使用互斥体,或者他不了解'事件'和/或'信号量'。 –