我试图将我的类实例传递给线程,并从线程返回处理过的对象。我在谷歌上搜索了 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::thread
与 std::packaged_task
混合.第三,处理std::thread
和 std::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";
}
}
与 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/