c++ - 关于 C++ 中 std::promise 的错误

标签 c++ multithreading return-value std promise

我试图将我的类实例传递给线程,并从线程返回处理过的对象。我在谷歌上搜索了 C++ 多线程,发现 std::promising 很有用。

但是,我一开始就卡住了。这是我的代码:

void callerFunc()
{
    //...
    std::promise<DataWareHouse> data_chunks;    
    // DataWareHouse is my customized class
    //data_chunks has a vector<vector<double>> member variable
    std::thread(&run_thread,data_chunks);
    // ............
}

void run_thread(std::promise<DataWareHouse> data_chunks)
{
    // ... 
    vector<vector<double>> results;
    // ...
    data_chunks.set_value(results);
}

上面的代码会产生一个错误:

 `error C2248: 'std::promise<_Ty>::promise' : cannot access private member declared in class 'std::promise<_Ty>'`

我可以知道我做错了什么以及如何解决吗?

非常感谢。 :-)

最佳答案

您的第一个问题是您正在使用 std::thread -- std::thread是一个低级类,您应该在其上构建更高的抽象。线程在 C++11 中在 C++ 中新标准化,所有粗糙的部分还没有归档。

在 C++11 中使用线程的三种不同模式可能对您有用。

首先,std::async .二、std::threadstd::packaged_task 混合.第三,处理std::threadstd::promise原始的。

我将说明第三个级别,这是最低级别且最危险的级别,因为这是您要求的。我建议查看前两个选项。

#include <future>
#include <vector>
#include <iostream>

typedef std::vector<double> DataWareHouse;

void run_thread(std::promise<DataWareHouse> data_chunks)
{
  DataWareHouse results;
  results.push_back( 3.14159 );
  data_chunks.set_value(results);
}

std::future<DataWareHouse> do_async_work()
{
  std::promise<DataWareHouse> data_chunks;  
  std::future<DataWareHouse> retval = data_chunks.get_future();
  // DataWareHouse is my customized class
  //data_chunks has a vector<vector<double>> member variable
  std::thread t = std::thread(&run_thread,std::move(data_chunks));
  t.detach(); // do this or seg fault
  return retval;
}

int main() {
  std::future<DataWareHouse> result = do_async_work();
  DataWareHouse vec = result.get(); // block and get the data
  for (double d: vec) {
    std::cout << d << "\n";
  }
}

Live example

std::async ,你会有一个函数返回 DataWareHouse , 它会返回一个 std::future<DataWareHouse>直接。

std::packaged_task<> , 这需要你的 run_thread并将其变成 packaged_task可以执行,和一个std::future从中提取。

关于c++ - 关于 C++ 中 std::promise 的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18212916/

相关文章:

c++ - 在单独的线程 Qt 中渲染屏幕外小部件

Android ACTION_IMAGE_CAPTURE Intent

javascript - 从 XMLHttpRequest 调用的 PHP 将值返回到 Javascript

指向 const 指针的 C++ 指针

c++ - 为什么编译共享库后函数的名称会改变?

c++ - boost spirit 的帮助函数(具有模板化返回类型的模板)

.net - Double Check Lock 模式应该与 ReaderWriterLockSlim 一起使用吗?

python - 更新 wx.Gauge 并使当前帧保持事件状态?