C++11 condition_variable与packaged_task,生产者与消费者
#include <deque>#include <mutex>#include <future>#include <thread>#include <iostream>#include <string>#include <condition_variable>using FuncType = i...
·
#include <deque>
#include <mutex>
#include <future>
#include <thread>
#include <iostream>
#include <string>
#include <condition_variable>
using FuncType = int(*)(int, int);
using TaskType = int();
std::mutex mut;
std::deque<std::packaged_task<TaskType>> tasks;
std::condition_variable cv;
//用户点击了屏幕的坐标事件
int user_click_screen(int x, int y)
{
std::this_thread::sleep_for(std::chrono::milliseconds(800)); //假设任务与任务之间间隔时间比较长
std::cout << "User-Screen Event:" << x << "," << y << std::endl;
return x + y;
}
//用户点击了窗口的坐标事件
int user_click_windows(int x, int y)
{
std::this_thread::sleep_for(std::chrono::milliseconds(800)); //假设任务与任务之间间隔时间比较长
std::cout << "User-Windows Event:" << x << "," << y << std::endl;
return x * y;
}
//把事件包装成更新GUI的任务,放到任务列表里
void post_user_events(FuncType f, int x, int y)
{
std::packaged_task<int()> t(std::bind(f, x, y));
std::unique_lock<std::mutex> lg(mut);
tasks.push_back(std::move(t));
cv.notify_one();
}
//发布任务线程:假设这个线程一直在监听用户对GUI的操作
void post_tasks_thread()
{
//发布10组任务
for (int i = 0; i < 10; ++i)
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000)); //假设任务与任务之间间隔时间比较长
//第一类操作。
post_user_events(user_click_screen, i + 1, i + 2);
std::this_thread::sleep_for(std::chrono::milliseconds(500)); //假设任务与任务之间间隔时间比较长
//第二类操作
post_user_events(user_click_windows, i + 3, i + 4);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
//第三类操作
//...
}
}
//更新GUI线程:负责根据接收到的用户事件任务来更新GUI
void update_gui_thread()
{
std::cout << "xxxxx" << std::endl;
while (true)
{
//获取任务
std::unique_lock<std::mutex> lg(mut);
cv.wait(lg, []() {return !tasks.empty(); });
std::packaged_task<TaskType> t = std::move(tasks.front());
tasks.pop_front();
lg.unlock();
//真正去执行任务,无需参数,因为发布任务的时候,已经将参数打包好了。
t();
//获取任务的执行结果
std::future<int> f = t.get_future();
int res = f.get();
std::cout << "任务执行结果:" << res << std::endl;
if (res > 100)
break;
}
}
int main()
{
std::thread t1(update_gui_thread);
std::thread t2(post_tasks_thread);
t1.detach();
t2.join();
}
更多推荐



所有评论(0)