用C++的std::thread实现一个类似::base::SequencedTaskRunner的功能
时间: 2024-01-11 11:06:08 浏览: 141
以下是一个简单的实现示例:
```c++
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
class SequencedTaskRunner {
public:
SequencedTaskRunner() : done_(false) {
thread_ = std::thread(&SequencedTaskRunner::Run, this);
}
~SequencedTaskRunner() {
{
std::unique_lock<std::mutex> lock(mutex_);
done_ = true;
}
condition_.notify_all();
thread_.join();
}
void PostTask(std::function<void()> task) {
{
std::unique_lock<std::mutex> lock(mutex_);
tasks_.push(task);
}
condition_.notify_one();
}
private:
void Run() {
while (true) {
std::unique_lock<std::mutex> lock(mutex_);
condition_.wait(lock, [this]() { return done_ || !tasks_.empty(); });
if (done_)
break;
auto task = tasks_.front();
tasks_.pop();
lock.unlock();
task();
}
}
std::thread thread_;
std::mutex mutex_;
std::condition_variable condition_;
std::queue<std::function<void()>> tasks_;
bool done_;
};
int main() {
SequencedTaskRunner runner;
runner.PostTask([](){ std::cout << "Task 1\n"; });
runner.PostTask([](){ std::cout << "Task 2\n"; });
runner.PostTask([](){ std::cout << "Task 3\n"; });
runner.PostTask([](){ std::cout << "Task 4\n"; });
return 0;
}
```
这个类使用了一个std::thread来运行任务队列。在构造函数中,我们创建了一个新的线程并调用Run()函数。在Run()函数中,我们使用std::condition_variable来等待任务队列中的任务。如果队列为空并且done_标志为false,则线程将阻塞等待直到发现新的任务。如果done_标志为true,则线程退出。如果队列不为空,则线程将取出队列中的下一个任务并执行它。我们将PostTask()函数用于将新任务添加到队列中。
在main()函数中,我们创建了一个SequencedTaskRunner对象并用PostTask()函数向其添加了4个不同的任务。当线程运行时,它将按照任务添加的顺序依次执行它们。输出将是:
```
Task 1
Task 2
Task 3
Task 4
```
阅读全文