gpt4 book ai didi

c++ - 我的线程函数不会停止我想要的线程

转载 作者:行者123 更新时间:2023-11-28 04:04:56 24 4
gpt4 key购买 nike

我正在尝试制作一个秒表类,它有一个单独的倒计时线程。这里的问题是,当我使用取消功能或尝试在超时后再次设置秒表时,我的程序崩溃了。目前我确信这是由于一些线程问题,可能是因为误用。有没有人可以告诉我为什么这不起作用并且可以帮助我让它工作?

 Stopwatch.h

class Stopwatch
{
public:
void Run(uint64_t ticks);
void Set(uint64_t ms);
void Cancel();

private:
std::thread mythread;
};



Stopwatch.cpp

void Stopwatch::Run(uint64_t ticks)
{
uint64_t clockCycles = ticks;

while(clockCycles > 0){
std::this_thread::sleep_for(std::chrono::milliseconds(1));
clockCycles--;
}

//do anything timeout related, probab a cout in the future
}

void Stopwatch::Set(uint64_t ms)
{
mythread = std::thread(&Timer::Run, this, ms);
}

void Stopwatch::Cancel()
{
mythread.join();
}

我想要的是调用秒表设置时间并得到一些超时 react 。使用取消功能可以随时停止。之后,您可以使用设置功能重新启动它。

最佳答案

如评论中所述,您必须始终最终为可连接的 std::thread 调用 joindetach(即,有或曾经有一个关联的运行线程)。该代码在三个地方未能做到这一点。在 Set 中,使用 std::thread 的移动赋值来分配给线程而不考虑其先前的内容。因此,多次调用 Set 而不调用 Cancel 一定会终止。 Stopwatch 的移动赋值运算符或析构函数中也没有此类调用。

其次,因为Cancel只是调用了join,它会等待超时发生并执行后再返回,而不是取消定时器。要取消计时器,必须通知线程。另一方面,线程中的 Run 循环必须有一种方法可以得到通知。执行此操作的传统方法是使用 condition_variable。

例如:

class Stopwatch
{
public:
Stopwatch() = default;

Stopwatch(const Stopwatch&) = delete;
Stopwatch(Stopwatch&&) = delete;
Stopwatch& operator=(const Stopwatch&) = delete;
Stopwatch& operator=(Stopwatch&& other) = delete;

~Stopwatch()
{
Cancel();
}

void Run(uint64_t ticks)
{
std::unique_lock<std::mutex> lk{mutex_};
cv_.wait_for(lk, std::chrono::milliseconds(ticks), [&] { return canceled_; });
if (!canceled_)
/* timeout code here */;
}

void Set(uint64_t ms)
{
Cancel();
thread_ = std::thread(&Stopwatch::Run, this, ms);
}

void Cancel()
{
if (thread_.joinable())
{
{
std::lock_guard<std::mutex> lk{mutex_};
canceled_ = true;
}
cv_.notify_one();
thread_.join();
}
}

private:
bool canceled_ = false;
std::condition_variable cv_;
std::mutex mutex_;
std::thread thread_;
};

关于c++ - 我的线程函数不会停止我想要的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com