我想运行相同类型的任务(工作线程),但一次只能执行一定数量的任务.当任务完成时,其结果是新任务的输入,然后可以启动该任务.
有没有什么好的方法可以在C++ 11中使用异步/未来范例来实现它?
乍一看,它看起来很直接,您只需生成多个任务:
std::future<T> result = std::async(...);
Run Code Online (Sandbox Code Playgroud)
然后,运行result.get()以获取任务的异步结果.
然而,这里的问题是未来的对象必须存储在某种队列中并且一个接一个地等待.但是,可以一遍又一遍地迭代未来的对象,检查它们是否已准备好,但由于不必要的CPU负载,这是不可取的.
有可能以某种方式等待来自给定集合的任何未来准备好并获得其结果吗?
到目前为止,我能想到的唯一选择是没有任何异步/未来的老派方法.具体来说,产生多个工作线程并在每个线程的末尾将其结果推送到受互斥锁保护的队列中,该队列通过条件变量通知等待线程,该条件变量已更新队列以获得更多结果.
有没有其他更好的解决方案与异步/未来可能?
有很多类似的问题,但我仍然找不到任何与C99/C11中可变长度数组特征相关的答案.
如何将多维可变长度数组传递给C99/C11中的函数?
例如:
void foo(int n, int arr[][]) // <-- error here, how to fix?
{
}
void bar(int n)
{
int arr[n][n];
foo(n, arr);
}
Run Code Online (Sandbox Code Playgroud)
编译器(g++-4.7 -std=gnu++11)说:
error: declaration of ‘arr’ as multidimensional array must have bounds for all dimensions except the first
如果我改成它int *arr[],编译器仍抱怨:
error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘void foo(int, int**)’
下一个问题,如何通过值传递它以及如何通过引用传递它?显然,通常你不希望在将它传递给函数时复制整个数组.
对于常量长度数组,它很简单,因为正如"常量"所暗示的那样,在声明函数时应该知道长度:
void foo2(int n, int arr[][10]) // <-- ok …Run Code Online (Sandbox Code Playgroud) 是否可以使用NumPy多维数组执行最小/最大就地分配而无需额外的副本?
说,a并且b是两个2D numpy阵列,我想拥有a[i,j] = min(a[i,j], b[i,j])所有i和j.
一种方法是:
a = numpy.minimum(a, b)
Run Code Online (Sandbox Code Playgroud)
但根据文档,numpy.minimum创建并返回一个新数组:
numpy.minimum(x1,x2 [,out])
元素最小的数组元素.
比较两个数组并返回一个包含元素最小值的新数组.
所以在上面的代码中,它将创建一个新的临时数组(min of a和b),然后将其分配a并处理它,对吧?
有没有办法做这样的事情,a.min_with(b)以便将最小结果分配回a原位?
有没有办法在编译时通过名称/指针获取一个函数类型,并将其用作模板参数的默认值?
请考虑以下代码:
template <typename TreeNode>
void default_visitor(TreeNode* node)
{
std::cout << node->data << std::endl;
}
template <typename TreeNode, typename Visitor>
void binary_tree_traverse(TreeNode* root, Visitor visitor)
{
/* some tree traversal calling the visitor for a node: */
visitor(root);
}
Run Code Online (Sandbox Code Playgroud)
之后,binary_tree_traverse()可以使用任何访问者类型调用,例如:
// call with lambda
binary_tree_traverse(root,
[](BinaryTreeNode *node)
{ std::cout << node->data << std::endl; });
// call with default_visitor() or anything else...
binary_tree_traverse(root, default_visitor<BinaryTreeNode>);
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够省略visitor参数并像这样调用函数:
binary_tree_traverse(root);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它应该表现得就像调用它一样default_visitor<>.
问题是如何更改模板功能定义?像下面这样的东西将是一个理想的解决方案:
template <typename TreeNode,
typename Visitor = ?typeof? default_visitor<TreeNode>>
void …Run Code Online (Sandbox Code Playgroud)