C++11写一个线程函数,在这个函数体内可以控制线程的开启,运行一次,设置运行间隔,连续运行和结束运行
时间: 2024-09-19 22:01:41 浏览: 39
在C++11中,我们可以使用`std::thread`和`std::chrono::seconds`等库来创建和管理线程。下面是一个简单的示例,展示如何编写一个线程函数,该函数可以控制线程的生命周期:
```cpp
#include <iostream>
#include <thread>
#include <chrono>
// 定义一个线程函数
void thread_function(int loop_count, std::function<void()> task, int sleep_time = 0) {
for (int i = 0; i <= loop_count || !task; ++i) {
// 执行任务
task();
if (sleep_time > 0) {
// 设置线程暂停的时间,单位秒
std::this_thread::sleep_for(std::chrono::seconds(sleep_time));
}
}
std::cout << "Thread stopped." << std::endl;
}
// 示例任务
void do_something() {
std::cout << "Doing something in the thread... " << std::flush;
std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟耗时操作
std::cout << "Done.\n";
}
int main() {
// 创建线程并传入我们的任务
std::thread my_thread(thread_function, 5, do_something);
// 开始线程
my_thread.detach(); // 将线程变为非阻塞,让它立即开始
// 控制线程间隔和连续运行
auto interval = std::chrono::seconds(3); // 每隔3秒运行一次
std::this_thread::sleep_for(interval);
// 如果需要改变任务,这里可以更新task参数,然后再次启动
// 例如,如果你想停止线程,可以将task设为空(task = []{};)
return 0;
}
```
在这个例子中,`thread_function`接受一个循环次数、一个任务函数以及一个可选的睡眠时间。当任务完成或者达到指定循环次数时,线程会自动停止。通过修改`interval`变量,你可以调整线程的运行间隔。如果你希望线程无限期地按设定间隔运行,只需删除`for`循环条件即可。
注意:`my_thread.detach()`使得主线程不再等待线程完成,所以这是一个非阻塞线程。如果你想保持阻塞直到线程结束,可以不用这行代码,并在适当的位置添加`my_thread.join();`。然而,通常在多线程场景中,我们倾向于让主线程继续处理其他工作,而不是阻塞在那里。
阅读全文