【发布时间】:2012-07-24 17:26:07
【问题描述】:
我有这个元组双端队列:
deque<boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> > deque_wait;
我希望能够将这些元素与其他元素一一进行比较:
deque<boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> > deque_done;
这是因为我想看看哪些节点已经完成,然后让一个线程选择列表中的下一个并用它做一些事情,我的代码是这样的:
尝试做这样的事情:
bool tuple_compare(boost::tuple<ppa::Node*, ppa::Node*,
ppa::Node*, bool> &tuple_to_check)
{
for(int i = 0; i < deque_wait.size(); i++) {
boost::tuple<ppa::Node*, ppa::Node*, ppa::Node*, bool> tuple_compare = deque_wait.at(i);
ppa::Node *father = boost::get<0>(tuple_compare);
ppa::Node *son = boost::get<0>(tuple_compare);
ppa::Node *second_son = boost::get<2>(tuple_compare);
bool has_seq = boost::get<3>(tuple_compare);
cout << "checking " << boost::get<1>(tuple_to_check)->get_name() << " "
<< boost::get<2>(tuple_to_check)->get_name() << " "
<< boost::get<0>(tuple_compare)->get_name() << endl;
}
return true;
}
线程函数:
void wait_function(void)
{
try {
} catch (boost::lock_error &le)
{
cout << le.what() << " from " << boost::this_thread::get_id() << endl;
}
}
我知道需要互斥体,我已经计划好了,现在我只需要知道如何将双端队列的元素与其他元素进行比较,看看它们是否满足某些条件并运行它们,现在的比较是与排序功能一起使用,例如:
sort(deque_wait.begin(), deque_wait.end(), tuple_compare);
因为我虽然可以使用这个函数来比较两个双端队列,所以总而言之,我想做的是将 deque_done 的第一个元素与所有等待进行比较,如果满足条件,则将 bool 更改为 true,它们是不同的并等待,我想检查它们的原因是因为这是一个类似树的结构有一个父节点和 2 个儿子,所以每个元组都是这样,一个父节点和 2 个儿子,我需要看看哪些儿子有一个序列要放置它已经准备好做,哪一个不是让一个线程来接它,是否需要另一个像向量或另一个双端队列这样的东西并不重要,所以在这种情况下,价格并不重要,谢谢。 (:
【问题讨论】:
-
据我所知,您的
tuple_compare始终返回true,因此它不能用作std::sort()的标准。那么你想达到什么目标呢? -
是的,我知道解决方案不是草稿,我想要的是一种将第一个元组与所有其他元组、第二个、第三个等进行比较的方法,如果一些条件得到满足,当然是在双端队列中。 (:
-
deque_dones 的存在有什么理由吗?完成后为什么不更新原始元组?或者,为什么不在处理元组时将它们移出deque_wait队列? -
不,没有理由,实际上这就是我寻求帮助的原因,将它们移到哪里?我认为这样更容易看到它,等待被处理并完成(:
-
根据您提供的信息,
deque_done似乎包含deque_wait中的元组副本。除非有充分的理由拥有副本,否则不要这样做。相反,使用原始元组,并以某种方式表明它已完成(通过将其移出deque_wait,或以某种方式更新元组,例如)。哪种方法最适合您的情况,取决于元组的使用方式。
标签: c++ multithreading boost compare deque