我有一个类似于:
的单例类//Test.h
class Test
{
private:
static std::mutex mtx;
static std::condition_variable cv;
static bool end;
static void DoSomethingThread();
static void SomeOtherFunction();
public:
static void Start();
}
//Test.cpp
std::mutex Test::mtx;
std::condition_variable Test::cv;
bool Test::end = false;
void Test::Start()
{
std::thread t_thread(Test::DoSomethingThread);
while(a) {
if (b) {
// End thread.
std::unique_lock<std::mutex> lock(mtx);
Test::end = true;
Test::cv.notify_one();
t_thread.join();
Test::SomeOtherFunction();
// Restart thread.
Test::end = false;
t_thread = std::thread(Test::DoSomethingThread);
}
...
}
}
void Test::DoSomethingThread()
{
std::unique_lock<std::mutex> lock(mtx);
while (1) {
//Do some work here.
Test::cv.wait_for(lock, std::chrono::seconds(1000), []() { return Test::end; });
if (Test::end) { break; }
}
}
我在this page找到了这段代码,说实话,我真的不知道这是怎么回事。但这家伙和我有同样的问题,我认为这对我的情况有用,但它没有。
所以我现在拥有的是一个永远运行的线程t_thread
,它会做一些工作,然后再睡眠1000秒。我需要的是从睡眠中唤醒这个线程并退出它的一些方法。所以SomeOtherFunction()
可以完成它的工作,然后重新启动线程。
为什么这段代码不起作用,我怎样才能使它起作用?
答案 0 :(得分:0)
我回到原帖并做了:
if (b) {
{
// End thread.
std::unique_lock<std::mutex> lock(mtx);
Test::end = true;
Test::cv.notify_one();
}
t_thread.join();
Test::SomeOtherFunction();
// Restart thread.
Test::end = false;
t_thread = std::thread(Test::DoSomethingThread);
}
它现在有效。不管怎样,谢谢。