- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图在我的程序中使用 boost::latch 来阻止等待,直到所有线程完成或超时。我的代码如下。 ctpl是从https://github.com/vit-vit/CTPL采用的线程池库.
#include <boost/thread/latch.hpp>
#include <CTPL/ctpl.h>
#include <mutex>
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
ctpl::thread_pool outer_tp(100);
ctpl::thread_pool inner_tp(5, 5000);
auto out_func = [&inner_tp](int outer_id, int outer_invoke_idx) {
int num_batch = 20;
boost::latch latch_(num_batch);
auto func = [&latch_, &outer_invoke_idx](int inner_id, int inner_invoke_idx) {
try {
std::cout << "outer: " << outer_invoke_idx << ", inner: " << inner_invoke_idx << endl;
} catch (exception &ex) { cout << "error: " << ex.what() << endl; }
latch_.count_down();
};
for (int i = 0; i < num_batch; ++i) {
inner_tp.push(func, i);
}
latch_.wait_for(boost::chrono::milliseconds(1));
};
for (int i = 0; i < 5000; ++i) outer_tp.push(out_func, i);
outer_tp.stop(true);
return 0;
}
g++ -std=c++11 test.cpp -lboost_system -lpthread -lboost_chrono -lboost_thread
但是我收到以下错误消息。
bool boost::latch::count_down(boost::unique_lock&): Assertion `count_ > 0' failed.
如果我使用 latch_.wait() 而不是 latch_.wait_for() 或设置很长的等待时间,代码可以正常运行。因此,我猜想“超时”会导致此错误问题。有谁知道如何修复错误。
最佳答案
您的代码似乎没有什么问题。我认为通过引用在内部线程中引用 latch_
就是其中之一。将其替换为 shared_ptr
到 boost::latch
可以修复该问题。另一个问题与 outer_invoke_idx
类似。修复这些问题并等待 inner_tp
完成似乎可以让您的测试工作正常。
这是适合我的修改后的测试用例:
#include <boost/thread/latch.hpp>
#include <memory>
#include <CTPL/ctpl.h>
#include <mutex>
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
ctpl::thread_pool outer_tp(100);
ctpl::thread_pool inner_tp(5, 5000);
auto out_func = [&inner_tp](int outer_id, int outer_invoke_idx) {
int num_batch = 20;
auto latch_ = std::make_shared<boost::latch>(num_batch);
auto func = [latch_, outer_invoke_idx](int inner_id, int inner_invoke_idx) {
try {
std::cout << "outer: " << outer_invoke_idx << ", inner: " << inner_invoke_idx << endl;
} catch (exception &ex) { cout << "error: " << ex.what() << endl; }
latch_->count_down();
};
for (int i = 0; i < num_batch; ++i) {
inner_tp.push(func, i);
}
latch_->wait_for(boost::chrono::milliseconds(1));
};
for (int i = 0; i < 5000; ++i) outer_tp.push(out_func, i);
outer_tp.stop(true);
inner_tp.stop(true);
std::cout << "EXITING!!!" << std::endl;
return 0;
}
关于c++ - 如何使用 boost::latch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169293/
一 点睛 若干个线程并发执行某个特定的任务,然后等到所有的子任务都执行结束后在统一汇总,比如用户想要查询自己三年以来银行账户的流水,为了保证运行的数据库的数据量在一个恒定的范围之内,通常数据只会保存一
一 点睛 若干个线程并发执行某个特定的任务,然后等到所有的子任务都执行结束后在统一汇总,比如用户想要查询自己三年以来银行账户的流水,为了保证运行的数据库的数据量在一个恒定的范围之内,通常数据只会保存一
一 点睛 对 Latch 设计模式增加超时功能 二 实战 1 Latch package concurrent.latch; import java.util.concurrent.TimeUnit
我有以下代码对应于 Excel 中的 VBA 程序中的三个 ToggleButtons。单击一个按钮时,应该保持“按下”状态,而其他两个按钮应该“释放”。但是,使用我拥有的代码,我必须单击一个按钮两次
我试图在我的程序中使用 boost::latch 来阻止等待,直到所有线程完成或超时。我的代码如下。 ctpl是从https://github.com/vit-vit/CTPL采用的线程池库. #in
当我为一个 api 运行 import.io 示例时,比如官方 api 文档,我得到了这个错误。 此外,我输入'''pip install latch'''没有名为 latch in pips 的模块
提议包含在 C++14(又名 C++1y)中的是一些新的线程同步原语:锁存器和屏障。提案是 N3600: C++ Latches and Barriers N3666: C++ Latches and
我最初有以下代码: Boolean successCheckPoint = false; Boolean failureCheckPoint = false;
我想要实现的是暂停线程并等到 doSomeProcess() 被调用后再继续。但是由于一些奇怪的原因,整个过程卡在了 await 中,永远不会进入 Runnable.run。 代码片段: final
这个问题与我在 Java 并发主题中的作业有关。我的任务是生成新线程并通过给定的 concurrencyFactor 限制它们。也就是说,继续分派(dispatch)新线程,直到 Activity 线
我最近听说了新的 C++ 标准特性,它们是: std::latch std::barrier 我无法弄清楚,在哪些情况下它们是适用的并且彼此有用。 如果有人能举出一个例子来说明如何明智地使用它们中的每
我想通过 RxJS 制作 SR 锁存器。它应该采用 2 个流(#1 和 #2)并且仅当 #1 发出某些东西时才发出。 然后它应该忽略 #1 并听取 #2 直到它发出一些东西。然后它应该“重置”(编辑:
我正在阅读 java.util.concurrent API , 并发现 CountDownLatch:一种同步辅助工具,允许一个或多个线程等待,直到其他线程中正在执行的一组操作完成。 CyclicB
从文档中可以很清楚地看出它们之间的区别在于 std::barrier可以多次使用 std::latch只能使用一次。 在我看来,std::latch 只是 std::barrier 的一个特例,它添加
我听说锁存器和触发器之间的主要区别在于锁存器是异步的,而触发器是边沿触发的,这是有道理的。但是当我查看他们的shematic时,它们看起来几乎一样。 这是我能理解的一本书中的锁扣设计。 但这是我在各种
我已经阅读了数据表和谷歌,但我仍然不明白。 就我而言,我将 PIC18F26K20 的 PIN RC6 设置为 INPUT 模式: TRISCbits.TRISC6 = 1; 然后我用 PORT 和
我看到一个 stackoverflow 成员建议使用 Thread.join() 让一个“主”线程等待 2 个“任务”线程完成。 我会经常做一些不同的事情(如下所示),我想知道我的方法是否有任何问题。
在什么情况下我们应该使用“Latch until release”而不是“Switch until release”? 根据 LabVIEW 2011 Help : Latch until relea
因为我是 VHDL 的初学者,所以互联网上的所有答案都不适合我。 我正在使用按钮和 LED 在 vhdl 中制作密码界面。我的程序按预期正确模拟。 基本上,我希望 LED 在输入错误密码时闪烁,但在输
Time-out occurred while waiting for buffer latch type 2 for page (1:1535865), database ID 6. 这是我在尝试创
我是一名优秀的程序员,十分优秀!