class Class {
public:
Class ();
private:
std::thread* updationThread;
};
构造
Class::Class() {
updationThread = new std::thread(&someFunc);
}
在我的应用程序中的某个时刻,我必须暂停该线程并调用一个函数,并且在执行该函数后我必须恢复该线程。让我们说它发生在这里:
void Class::aFunction() {
functionToBeCalled(); //Before this, the thread should be paused
//Now, the thread should be resumed.
}
我尝试使用另一个功能为functionToBeCalled()
的线程并使用thread::join
但由于某种原因无法执行此操作。
如何暂停某个帖子或如何使用thread::join
暂停一个帖子直到另一方完成?
答案 0 :(得分:4)
我认为你不能轻易(以标准的方式)“暂停”一些线程,然后重新开始。我想如果你使用的是一些Unix风格的操作系统,你可以发送SIGSTOP和SIGCONT,但除此之外,你应该使用互斥锁和锁定正确地标记someFunc()
内的原子部分,使用锁定的functionToBeCalled()
包裹相应的互斥锁:
std::mutex m; // Global mutex, you should find a better place to put it
// (possibly in your object)
并在函数内部:
void someFunc() {
// I am just making up stuff here
while(...) {
func1();
{
std::lock_guard<std::mutex> lock(m); // lock the mutex
...; // Stuff that must not run with functionToBeCalled()
} // Mutex unlocked here, by end of scope
}
}
并且在致电functionToBeCalled()
时:
void Class::aFunction() {
std::lock_guard<std::mutex> lock(m); // lock the mutex
functionToBeCalled();
} // Mutex unlocked here, by end of scope
答案 1 :(得分:2)
您可以使用条件变量。这里给出了一个类似于你的情况的例子: http://en.cppreference.com/w/cpp/thread/condition_variable