我的问题的最小例子。
use std::future::Future;
async fn call_changer<'a, F, Fut>(changer: F)
where
F: FnOnce(&'a mut i32) -> Fut,
Fut: Future<Output = ()> + 'a,
{
let mut i = 0;
changer(&mut i).await; // error 1
dbg!(i); // error 2
}
#[tokio::main]
async fn main() {
call_changer(|i| async move {
*i = 100;
})
.await;
}
Run Code Online (Sandbox Code Playgroud)
这会导致两个相关的错误,请参阅Rust Playground以获取详细输出:
i的末端。call_changeri不能在await之后使用,因为它仍然被可变地借用。我对两者都感到有点惊讶,我理解为什么Future返回需要与其借用F具有相同的生命周期( )(相关的异步书籍部分)。然而,根据同一个参考文献,一旦我调用了 wait on的结果,借用就应该结束,这显然不会发生,否则我就不会出现这些错误。将此示例重写为类似本书的内容,其中函数不作为参数传递,而是直接调用,按预期工作。'achangerchanger
这是怎么回事?我能做些什么吗?&mut用构造替换Rc<RefCell<_>> …
是否std::async适用于模板功能?我试图在std::reverse异步任务中遇到编译时错误.
我试图使用更简单的函数(foo和bar)并发现只有非模板函数才有效.
#include <algorithm>
#include <future>
#include <string>
void foo(std::string::iterator first, std::string::iterator last)
{
}
template<class BidirectionalIterator>
void bar(BidirectionalIterator first, BidirectionalIterator last)
{
}
int main()
{
std::string str = "Lorem ipsum, dolor sit amet";
auto result_reverse = std::async(std::reverse, str.begin(), str.end()); // Compile-time error
auto result_foo = std::async(foo, str.begin(), str.end());
auto result_bar = std::async(bar, str.begin(), str.end()); // Compile-time error
result_reverse.get();
result_foo.get();
result_bar.get();
}
Run Code Online (Sandbox Code Playgroud)
编译器错误如下:
main.cpp: In function ‘int main()’:
main.cpp:18:71: erreur: no matching function for call …Run Code Online (Sandbox Code Playgroud) 您好我在Windows文档中找到了此代码
但我没有得到什么意思
[&]
Run Code Online (Sandbox Code Playgroud)
只是请你能清楚我该怎么办?
它不是c ++标准的真实?
这是代码:
void parallel_matrix_multiply(double** m1, double** m2, double** result, size_t size)
{
parallel_for (size_t(0), size, [&](size_t i)
{
for (size_t j = 0; j < size; j++)
{
double temp = 0;
for (int k = 0; k < size; k++)
{
temp += m1[i][k] * m2[k][j];
}
result[i][j] = temp;
}
});
}
Run Code Online (Sandbox Code Playgroud) 我试图谷歌这个,但总是回来与不同的问题.当我尝试编译这个程序时,我得到3个未解析的外部:
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall DynIntStack<char>::~DynIntStack<char>(void)" (??1?$DynIntStack@D@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::pop(char &)" (?pop@?$DynIntStack@D@@QAEXAAD@Z) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall DynIntStack<char>::push(char)" (?push@?$DynIntStack@D@@QAEXD@Z) referenced in function _main
Run Code Online (Sandbox Code Playgroud)
DynIntStack.h
/****************************************************************************
DynIntStack class.
Chad Peppers
This class creates a object for stacking nodes
In addition, there should be member functions to perform the following
operations:
- Push to the stack …Run Code Online (Sandbox Code Playgroud) 这是我遇到的实现快速排序算法的代码.你能解释一下递归是如何起作用的吗?
void quickSort(int arr[], int left, int right)
{
int i = left, j = right;
int tmp;
int pivot = arr[(left + right) / 2];
/* partition */
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
/* recursion */
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要从openGL应用程序的前端缓冲区读回整个帧的应用程序.我可以劫持应用程序的opengl库并在swapbuffers上插入我的代码.目前,我成功地使用了一个简单但令人难以忍受的慢速glReadPixels命令而没有PBO.
现在我读到了使用多个PBO来加快速度.虽然我认为我已经找到足够的资源来实际编程(并不是那么难),但我还是有一些操作问题.我会做这样的事情:
现在我主要关心的是步骤2和3.我读到关于PBO上使用的glReadPixels是非阻塞的,如果我在那之后发出新的opengl命令会是一个问题吗?那些opengl命令会阻塞吗?或者他们会继续(我的猜测),如果是这样,我猜只有交换缓冲区可能是一个问题,这一个停止或将来自前缓冲区的glReadPixels比交换快几倍(大约每15-> 30ms)或最坏的情况下在glReadPixels仍在向PBO读取数据时,是否会执行swapbuffers?我目前的猜测是这个逻辑会做这样的事情:复制FRONT_BUFFER - > VRAM中的通用位置,复制VRAM-> RAM.但我不知道这两个中哪一个是真正的瓶颈还有更多,对普通opengl命令流的影响是什么.
然后在第3步中.在与普通opengl逻辑分离的线程中异步执行此操作是否明智?目前我认为不是,在执行此操作后,您似乎必须将缓冲区操作恢复到正常状态,并且我无法在原始代码中安装同步对象以暂时阻止这些操作.所以我认为我最好的选择是在读出它们之前定义一个特定的交换缓冲区延迟,所以例如在PBO i%3上调用glReadPixels,在同一线程中调用PBO(i + 2)%3上的glMapBufferARB,导致2帧的延迟.另外,当我调用glMapBufferARB来使用客户端内存中的数据时,这会成为瓶颈还是glReadPixels(异步)成为瓶颈?
最后,如果你有更好的想法来加速opengl中GPU的帧回读,请告诉我,因为这是我当前系统中的一个痛苦的瓶颈.
我希望我的问题很清楚,我知道答案可能也会出现在互联网上,但我主要想出的结果是使用PBO将缓冲区保存在视频内存中并在那里进行处理.我真的需要将前缓冲区读回RAM并且在这种情况下我没有找到关于性能的任何明确解释(我需要,我不能依赖"它更快",我需要解释为什么它更快).
谢谢
如何被动地监听stderr并将其作为字符串发送到回调?我看过有关阅读stderr的帖子,但我想听而不是积极阅读它.
背景:我有一个跨平台的部分,使用第三方库(libcurl),它将详细信息输出到stderr.这个跨平台的部分将被超过1个非跨平台的应用程序使用.
我想记录这些信息,我可以通过向libcurl提供FILE*来完成.但是,我想看看我是否可以捕获(被动地监听)stderr中的输出作为字符串,并通过回调发送回调用主应用程序.这有一个好处1.主应用程序可以使用它想要的任何日志记录工具保留单个日志.它会使这件作品跨平台.
你会考虑这个糟糕设计的证据吗?
//FooType and BarType not in the same hierarchy
bool operator==(const FooType &, const BarType &);
bool operator<(const FooType &, const BarType &);
Run Code Online (Sandbox Code Playgroud)
例如,如果FooType是double测量自纪元秒,BarType是三个整数(年,月,日)在UTC提供的日期,如上述比较"有意义"的元组.
你见过这种类型间的比较吗?他们在C++社区中不受欢迎吗?
我可以使用glGenBuffers函数生成多少个缓冲区?我可以尝试生成8192(或更多)缓冲区吗?
我只渲染一个缓冲区,但我需要存储许多缓冲区.
int i = 0;
glGetIntegerv(GL_MAX_DRAW_BUFFERS, &i);
Run Code Online (Sandbox Code Playgroud)
回报8.这是缓冲区的最大计数,即同时渲染.
我对吗?
我想知道新的C++ 11 lambda功能,在我的拙见中是一个很好的补充,但我真的没有得到整个变量捕获部分.简而言之,我的问题归结为"为什么委员会决定这一点并且不仅仅使用[&]功能(可能还有关键字)?"
起初我想'哇,C++再来一次,给我们更强大的羔羊,尽管语法很难过'.然而,然后我试着想到这个复杂的lambdas真实有用的案例,我想不出任何.
首先,如果你想混合pass-by-reference和pass-by-value,你显然需要它.那么问题是,我们实际上是否需要lambda结构中的pass-by-value.在lambda体内创建临时文件有什么问题.如果你想要一个循环体中的上部范围变量的副本,这是类似的,我们也不写[x] while(...) { ... }.我在这里遗漏了一些东西,这使得通过价值真的很有必要,你不能再自己构建一个副本了吗?
所以我们来到第二部分,假设没有必要使用pass-by-value,使用当前语法可以指定要捕获哪些变量,哪些不是.我再一次看不到这个好处.lambda是在本地范围内编写的,与变量相同.为什么需要限制对这些变量的访问?它不是一个接口,不是另一个上下文,它甚至不应该是另一个程序员.它也不会为编译器优化它,因为[&]自己使用或提及每个使用过的变量应归结为相同的代码.
现在,我确实知道我并没有完全掌握C++,委员会的人比我更了解.所以,我的哪些论点是错误的(或者我错过了什么)以及为什么他们不仅仅决定使用这些[&]功能,最好是使用关键字而不是当前(相当丑陋)的语法.