C++11如何控制thread运行一次和间隔时间运行一次,连续运行,停止运行
时间: 2024-09-18 11:05:53 浏览: 72
基于Qt和C++实现的运行时间记录+源码
在C++11中,你可以使用`std::thread`和`std::condition_variable`结合`std::mutex`来控制线程的运行模式。以下是几种可能的策略:
1. **一次性运行**:
- 如果你想让线程只运行一次,可以在线程函数内部添加一个标志变量,初始化为true,当线程完成任务后将该标志设置为false。然后在外围使用一个互斥锁保护这个标志,并在一个条件变量上设置等待,直到任务完成。
```cpp
#include <thread>
#include <mutex>
#include <condition_variable>
bool should_run = true;
std::mutex mtx;
std::condition_variable cond;
void run_once() {
std::unique_lock<std::mutex> lock(mtx);
while (should_run) {
// 线程执行任务...
should_run = false; // 完成后设置为false
lock.unlock();
cond.notify_all(); // 唤醒等待的线程
lock.lock();
}
}
int main() {
std::thread t(run_once);
t.join(); // 等待线程结束
return 0;
}
```
2. **定期运行(循环)**:
- 可以通过定时器配合条件变量实现,例如使用`std::chrono::seconds`来设定间隔。当达到预定时间后,检查是否应该继续运行,如果需要则唤醒其他等待的线程。
```cpp
#include <thread>
#include <chrono>
#include <mutex>
#include <condition_variable>
void run_periodically(int interval) {
std::unique_lock<std::mutex> lock(mtx);
while (true) {
// 执行任务...
// 模拟延迟
std::this_thread::sleep_for(std::chrono::seconds(interval));
// 判断是否应继续
// 这里仅作示例,实际应用需替换为适当的检查逻辑
if (should_stop()) break;
// 唤醒等待的线程
cond.notify_one();
}
}
int main() {
std::thread t(run_periodically, 5); // 每隔5秒运行一次
// ...加入其他的控制逻辑来停止t
return 0;
}
```
3. **停止线程**:
- 在上述例子中,可以通过在主线程或外部回调中改变`should_run`标志来停止线程。一旦将其设置为false,线程就会退出循环。
```cpp
// 示例:主程序提供停止信号
void stop_thread() {
std::lock_guard<std::mutex> lock(mtx);
should_run = false;
cond.notify_all(); // 唤醒线程
}
// 在main或其他适当的地方调用stop_thread()
```
阅读全文