小编Kil*_*nDS的帖子

使用(可变的)借用参数调用通用异步函数

我的问题的最小例子。

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以获取详细输出:

  1. 借物的寿命不够长,因为掉落在身体i的末端。call_changer
  2. i不能在await之后使用,因为它仍然被可变地借用。

我对两者都感到有点惊讶,我理解为什么Future返回需要与其借用F具有相同的生命周期( )(相关的异步书籍部分)。然而,根据同一个参考文献,一旦我调用了 wait on的结果,借用就应该结束,这显然不会发生,否则我就不会出现这些错误。将此示例重写为类似本书的内容,其中函数不作为参数传递,而是直接调用,按预期工作。'achangerchanger

这是怎么回事?我能做些什么吗?&mut用构造替换Rc<RefCell<_>> …

rust async-await

12
推荐指数
1
解决办法
1948
查看次数

std :: async可以与模板函数一起使用

是否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)

c++ templates asynchronous std c++11

11
推荐指数
2
解决办法
2125
查看次数

c ++ [&]运算符

您好我在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)

c++ c++11

11
推荐指数
5
解决办法
4434
查看次数

C++不断收到错误LNK2019:未解析的外部符号

我试图谷歌这个,但总是回来与不同的问题.当我尝试编译这个程序时,我得到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)

c++ linker templates

7
推荐指数
2
解决办法
2万
查看次数

快速排序代码说明

这是我遇到的实现快速排序算法的代码.你能解释一下递归是如何起作用的吗?

 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)

c++ algorithm recursion quicksort

6
推荐指数
1
解决办法
8万
查看次数

使用多个PBO从opengl前端缓冲区异步回读

我正在开发一个需要从openGL应用程序的前端缓冲区读回整个帧的应用程序.我可以劫持应用程序的opengl库并在swapbuffers上插入我的代码.目前,我成功地使用了一个简单但令人难以忍受的慢速glReadPixels命令而没有PBO.

现在我读到了使用多个PBO来加快速度.虽然我认为我已经找到足够的资源来实际编程(并不是那么难),但我还是有一些操作问题.我会做这样的事情:

  1. 创建一系列(例如3)PBO
  2. 在我的swapBuffers覆盖中使用glReadPixels将数据从前缓冲区读取到PBO(应该快速且无阻塞,对吧?)
  3. 创建一个单独的线程来调用glMapBufferARB,在glReadPixels之后每个PBO调用一次,因为这将阻塞,直到像素在客户端内存中.
  4. 处理步骤3中的数据.

现在我主要关心的是步骤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并且在这种情况下我没有找到关于性能的任何明确解释(我需要,我不能依赖"它更快",我需要解释为什么它更快).

谢谢

opengl

5
推荐指数
1
解决办法
2669
查看次数

如何在C/C++中监听stderr以发送回调?

如何被动地监听stderr并将其作为字符串发送到回调?我看过有关阅读stderr的帖子,但我想听而不是积极阅读它.

背景:我有一个跨平台的部分,使用第三方库(libcurl),它将详细信息输出到stderr.这个跨平台的部分将被超过1个非跨平台的应用程序使用.

我想记录这些信息,我可以通过向libcurl提供FILE*来完成.但是,我想看看我是否可以捕获(被动地监听)stderr中的输出作为字符串,并通过回调发送回调用主应用程序.这有一个好处1.主应用程序可以使用它想要的任何日志记录工具保留单个日志.它会使这件作品跨平台.

c++ cross-platform stdout stderr

5
推荐指数
1
解决办法
1783
查看次数

比较不同类型的对象是否被认为是好的设计?

你会考虑这个糟糕设计的证据吗?

//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)

例如,如果FooTypedouble测量自纪元秒,BarType是三个整数(年,月,日)在UTC提供的日期,如上述比较"有意义"的元组.

你见过这种类型间的比较吗?他们在C++社区中不受欢迎吗?

c++ operator-overloading

5
推荐指数
1
解决办法
1086
查看次数

最大缓冲区数

我可以使用glGenBuffers函数生成多少个缓冲区?我可以尝试生成8192(或更多)缓冲区吗?

我只渲染一个缓冲区,但我需要存储许多缓冲区.

int i = 0;
glGetIntegerv(GL_MAX_DRAW_BUFFERS, &i);
Run Code Online (Sandbox Code Playgroud)

回报8.这是缓冲区的最大计数,即同时渲染.

我对吗?

c++ opengl buffer

4
推荐指数
1
解决办法
1948
查看次数

为什么lambda中的变量捕获如此复杂?

我想知道新的C++ 11 lambda功能,在我的拙见中是一个很好的补充,但我真的没有得到整个变量捕获部分.简而言之,我的问题归结为"为什么委员会决定这一点并且不仅仅使用[&]功能(可能还有关键字)?"

起初我想'哇,C++再来一次,给我们更强大的羔羊,尽管语法很难过'.然而,然后我试着想到这个复杂的lambdas真实有用的案例,我想不出任何.

首先,如果你想混合pass-by-reference和pass-by-value,你显然需要它.那么问题是,我们实际上是否需要lambda结构中的pass-by-value.在lambda体内创建临时文件有什么问题.如果你想要一个循环体中的上部范围变量的副本,这是类似的,我们也不写[x] while(...) { ... }.我在这里遗漏了一些东西,这使得通过价值真的很有必要,你不能再自己构建一个副本了吗?

所以我们来到第二部分,假设没有必要使用pass-by-value,使用当前语法可以指定要捕获哪些变量,哪些不是.我再一次看不到这个好处.lambda是在本地范围内编写的,与变量相同.为什么需要限制对这些变量的访问?它不是一个接口,不是另一个上下文,它甚至不应该是另一个程序员.它也不会为编译器优化它,因为[&]自己使用或提及每个使用过的变量应归结为相同的代码.

现在,我确实知道我并没有完全掌握C++,委员会的人比我更了解.所以,我的哪些论点是错误的(或者我错过了什么)以及为什么他们不仅仅决定使用这些[&]功能,最好是使用关键字而不是当前(相当丑陋)的语法.

c++ c++11

3
推荐指数
1
解决办法
573
查看次数