- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的多线程 C++ 代码中经常使用 asio::io_service。最近,由于在处理各种任务时缺乏优先级,我发现我的代码存在瓶颈。我很自然地遇到了这个提升 example以确保某些任务的优先级高于其余任务。但此示例仅适用于单线程应用程序。
通常,我的代码使用这种模式。
boost::asio::io_service ioService;
boost::thread_group threadPool;
boost::asio::io_service::work work(ioService);
int noOfCores = boost::thread::hardware_concurrency();
for (int i = 0 ; i < noOfCores ; i ++)
{
threadPool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
}
threadPool.join_all();
我从其他各种线程执行了很多 ioService.post() 操作,所有这些处理程序都具有相同的优先级。
现在,如果我要使用 boost 示例中的 handler_priority_queue,首先我必须向 add() 和 execute_all() 函数添加一些互斥保护。
boost::mutex _mtx;
void add(int priority, boost::function<void()> function)
{
boost::lock_guard<boost::mutex> lock(_mtx);
handlers_.push(queued_handler(priority, function));
}
void execute_all()
{
while (!handlers_.empty())
{
boost::unique_lock<boost::mutex> lock(_mtx);
queued_handler handler = handlers_.top();
handlers_.pop();
lock.unlock();
handler.execute();
}
}
但是,我不确定用什么替换我当前代码中的以下行。
threadPool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
我显然需要以某种方式将 io_service::run 替换为 handler_priority_queue::execute_all()。但是怎么办?什么是最好的方法?
我可以做到这一点......
threadPool.create_thread(boost::bind(&handler_priority_queue::execute_all,
&pri_queue));
但是 execute_all() 马上就出来了。我认为 execute_all() 需要以某种方式重新设计。这个怎么样?它有效,但我不确定其中的陷阱。
void execute_all()
{
while (ioService.run_one())
{
while (ioService.poll_one());
while (true)
{
queued_handler handler;
{
boost::lock_guard<boost::mutex> lock(_mtx);
if (handlers_.empty())
{
break;
}
else
{
handler = handlers_.top();
handlers_.pop();
}
}
handler.execute();
}
}
}
最佳答案
Asio 不提供这种可能性。该示例仅限于单个线程,因为它不修改 Asio 的调度程序。调度程序以 FIFO 方式在线程之间分配任务,我不知道有什么方法可以修改它。只要在启动异步操作时无法指定优先级(例如 io_service::post
),调度程序就不知道任务优先级,因此无法使用它。
当然,您可以为每个线程使用 priority_queue
,但在这种情况下,您的优先级将产生有限的“线程本地”效果:只有调度到同一线程的任务才会根据它们的优先级执行。考虑示例(伪代码):
io_service.post(task(priority_1));
io_service.post(task(priority_2));
io_service.post(task(priority_3));
thread_1(io_service.run());
thread_2(io_service.run());
假设任务 1 和 3 由 thread_1
执行,任务 2 由 thread_2
执行。因此,如果在链接示例中使用优先级队列,则 thread_1
将执行任务 3,然后执行任务 1。但是 thread_2
不知道这些任务,会立即执行任务 2,可能在任务 3 之前执行。
您的选择要么是实现自己的调度程序(复杂性取决于您的要求,但通常会很棘手),要么是寻找第 3 方解决方案。例如。我会检查英特尔 TBB Priority .
编辑:试图详细说明“自己的调度程序”案例:
对于更简单的版本、线程池和从队列中提取的线程,您需要一个非常好的多生产者/多消费者并发队列。从优先级的角度来看,这将是一个相当公平的解决方案:所有优先级较高的任务将(几乎总是)在优先级较低的任务之前开始执行。如果性能比公平更重要,则可以改进此解决方案。但这需要另一个问题和有关您的特定案例的大量详细信息。
关于c++ - asio::io_service 多线程优先级队列处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51991388/
int x = 1; System.out.println( x++ + x++ * --x ); 上面的代码打印出“5”,但我不明白怎么办?我一直为最后一个 x 取零,然后乘以仍然为 0 的第二个
我现在正在尝试使用 Preference 类 首选项 pfrOfThis = Preferences.userNodeForPackage(this) 出现错误: “类 java.util.prefs
用下面的代码 import sys print "Hello " + sys.argv[1] if len(sys.argv) > 1 else "Joe" + "." 当我运行时 python he
我的网页包含: td { padding-left:10px; } 引用的样式表包含: .rightColumn * {margin: 0; padding: 0;} 我在 rightc
使用 JPA 我有一个关于 CascadeTypes 的问题。 例如: @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,
下面的“括号”是怎么写的? val words = List("foo", "bar", "baz") val phrase = "These are upper case: " + words ma
我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。 int i = 0, k = 0; i = k++; 如果我们根据关联性和优先级进行评估,postfix ++具有比
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
这是一个简单的 CSS: /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-devi
我设置了一个 Azure FrontDoor 服务,以主/备份类型的方式将流量分配给两个 API 管理服务。就像我希望所有流量都流向我的主要 APIM 服务一样,如果我碰巧关闭该服务(假装中断),那么
来自 Programming Perl pg 90,他说: @ary = (1, 3, sort 4, 2); print @ary; 排序右侧的逗号在排序之前求值,而左侧的逗号在排序之
+----+------------+------+ | id | title | lang | +----+------------+------+ | 1 | title 1 EN |
如何使用 Java 获取 DiffServe 代码点 (DSCP) 整数的优先级部分?我预计它涉及位移位,但由于某种原因,我似乎无法获得我期望的值。 最佳答案 假设我理解正确,只需向右执行 3 位逻辑
我有下一个运行良好的 js 函数: $(function () { $(".country").click(function () { var countries = Arra
int a[3]={10,20,30}; int* p = a; cout << *p++ << endl; 根据 wikipedia ,后缀++的优先级高于解引用,*p++应该先运行p++再解引用结
我想在优先读取归档后解决这种类型的表达式 2+3/5*9+3-4 这是我尝试解决该任务的代码我该如何解决这个问题 while ( !inputFile.eof() ) { getline( inp
我正在玩 Rhino 并注意到这种奇怪的行为似乎是运算符优先级: js> {}+{} NaN js> ''+{}+{} [object Object][object Object] js> ''+({
我想遍历文件列表并检查它们是否存在,如果文件不存在则给出错误并退出。我写了下面的代码: FILES=( file1.txt file2.txt file3.txt ) for file in ${FI
我正在执行级联 SELECT: SELECT * FROM x WHERE a = 1 AND b = 2 AND c = 3 => If nothing found, try: SELECT * F
即将参加考试,我正在参加之前的考试。 问题: 当两个或多个样式表规则应用于同一元素时,以下哪种类型的规则将优先? 一个。任何来自浏览器的声明 b.有用户来源的正常声明 C。作者来源正常声明 d.文档级
我是一名优秀的程序员,十分优秀!