- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编译下面的程序时,出现错误信息:
错误 1 错误 C2228:'.get_future' 的左侧必须具有类/结构/union c:\users\haliaga\documents\visual studio 2010\projects\test\test\accumulateexceptionssafe.cpp 62 1 测试
这实际上不是真正的问题。
如果你评论这些行:
//futures[i]=task.get_future();
//threads[i]=std::thread(std::move(task),block_start,block_end);
//block_start=block_end;
你会得到下面的警告,说“tasK”没有被调用:
*警告 C4930:“std::packaged_task<> task(accumulate_block (__cdecl )(void))”:未调用原型(prototype)函数(是否为变量定义?)1> 与1> [1> =int (std::_List_iterator>>,std::_List_iterator>>),1> 迭代器=std::_List_iterator>>,1> T=整数1> ]
什么是指定的正确方法:
std::packaged_task<T(Iterator,Iterator)> task(accumulate_block<Iterator,T>());
?
谢谢
PS:找到下面的代码:
#include <list>
#include <numeric>
#include <vector>
#include <thread>
#include <future>
using namespace std;
template<typename Iterator,typename T>
struct accumulate_block
{
T operator()(Iterator first, Iterator last)
{
std::thread::id id = std::this_thread::get_id();
return std::accumulate(first, last, T());
}
};
class join_threads
{
std::vector<std::thread>& threads;
public:
explicit join_threads(std::vector<std::thread>& threads_):
threads(threads_)
{
std::thread::id id = std::this_thread::get_id();
}
~join_threads()
{
std::thread::id id = std::this_thread::get_id();
for(unsigned long i=0;i<threads.size();++i)
{
if(threads[i].joinable())
threads[i].join();
}
}
};
template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
std::thread::id id = std::this_thread::get_id();
unsigned long const length=std::distance(first,last);
if(!length)
return init;
unsigned long const min_per_thread=25;
unsigned long const max_threads=(length+min_per_thread-1)/min_per_thread;
unsigned long const hardware_threads=std::thread::hardware_concurrency();
unsigned long const num_threads=std::min(hardware_threads!=0?hardware_threads:2,max_threads);
unsigned long const block_size=length/num_threads;
std::vector<std::future<T> > futures(num_threads-1);
std::vector<std::thread> threads(num_threads-1);
join_threads joiner(threads);
Iterator block_start=first;
for(unsigned long i=0;i<(num_threads-1);++i)
{
Iterator block_end=block_start;
std::advance(block_end,block_size);
std::packaged_task<T(Iterator,Iterator)> task(accumulate_block<Iterator,T>());
futures[i]=task.get_future();
threads[i]=std::thread(std::move(task),block_start,block_end);
block_start=block_end;
}
T last_result=accumulate_block<Iterator, T>()(block_start,last);
T result=init;
for(unsigned long i=0;i<(num_threads-1);++i)
{
result+=futures[i].get();
}
result += last_result;
return result;
};
int main()
{
list<int> l;
for(int i=0; i<26; ++i)
l.push_back(i);
std::thread::id id = std::this_thread::get_id();
int res = ::parallel_accumulate(l.begin(), l.end(), 0);
return 0;
}
最佳答案
最烦人的解析。
std::packaged_task<T(Iterator,Iterator)> task(accumulate_block<Iterator,T>());
声明一个名为 task
的函数它接受一个类型为指针的参数,该函数不接受任何参数并返回一个 accumulate_block<Iterator,T>
并返回 std::packaged_task<T(Iterator,Iterator)>
.
使用统一初始化语法消除歧义:
std::packaged_task<T(Iterator,Iterator)> task(accumulate_block<Iterator,T>{});
或者为不支持统一初始化的古老编译器添加一对额外的括号:
std::packaged_task<T(Iterator,Iterator)> task((accumulate_block<Iterator,T>()));
// ^ ^
关于c++ - 设置 packaged_task 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28640788/
正在关注 this excellent tutorial对于futures、promises 和打包任务,我到了要准备自己的任务的地步 #include #include using namesp
在下面的程序中,我试图创建一个带有成员函数的 packaged_task: #include using namespace std; struct S { int calc(int& a)
我天真地期望它能编译: template auto run(Func && func) { auto package = std::packaged_task{std::forward(fu
我正在尝试使用这样的仿函数创建一个打包任务: Worker w(someString, anotherString, i*length,length); boost::packaged_task ta
我试图绕过 std::packaged_task 缺少复制构造函数的问题,以便我可以将它传递给 std::function(它只会被移动)。 我继承自 std::packaged_task 并添加了一
嗨,我不知道如何编写一个正确的队列绑定(bind)并执行传递给方法 OCRQueue::enqueue() 的 lambda 表达式 // the task queue std::queue > ta
编译下面的程序时,出现错误信息: 错误 1 错误 C2228:'.get_future' 的左侧必须具有类/结构/union c:\users\haliaga\documents\visual s
我正在分析以下代码片段并试图详细理解它: template auto ThreadPool::add( FUNCTION&& Function, ARGUMENTS&&... Arguments )
我从 http://en.cppreference.com/w/cpp/thread/packaged_task 中的部分代码中复制了一个奇怪的核心转储, #include #include #i
我正在尝试采用 std::async 风格的“任务”并将其存储在容器中。我必须克服困难才能实现它,但我认为一定有更好的方法。 std::vector> mTasks; template std::fu
我最近在我的项目上运行 valgrind --tool=helgrind 并收到警告“可能的数据竞争”,我认为这是令人担忧的。然而,即使是这个简单的测试程序也会导致此消息: #include #in
我正在尝试使用 packaged_task 实现异步。我正在通过一个模板化函数 bsync 来尝试这个。 bsync 接受 2 个参数:一个函数 f 和一个参数包 args,并返回一个 future
我一直在寻找 problem of type-erasing a std::packaged_task using std::function 的解决方法. 我想做的是这样的: #include #
我正在玩 Antony Williams - C++ Concurrency in Action 一书中的示例 4.14,其中使用 std::packaged_task 和 std::thread 模
我试图将 std::packaged_task 包装在另一个类中,以便与任务调度程序一起使用。 目前,除了 std::future 支持外,我的一切都正常工作。为了获得 std::future 支持,
我正在尝试围绕 Glib::Dispatcher 构建一些包装器,以将任何功能类型分派(dispatch)到分派(dispatch)器中。我想要一些可以将函数传输到 Glib 主循环中的函数分派(di
std::packaged_task 模板有一个接受分配器的构造函数: packaged_task pt {allocator_arg_t, a, f}; 我想问: 1) 它的存在表明 package
是否有一种标准方法可以将 std::packaged_task 添加到现有线程?在任务运行之前必须发生大量开销,所以我想这样做一次,然后保持线程运行并等待任务执行。我希望能够使用 futures,这样
我正在尝试将 packaged_task 包装在 lambda 中,以便将它们存放在容器中。我在下面写了一个测试代码来模拟包装和调用 lambda 函数。我的代码如下: int test() {
在使用 C++11 的线程模型时,我注意到 std::packaged_task task([](int a, int b) { return a + b; }); auto f = task.get
我是一名优秀的程序员,十分优秀!