C++11 C+中的异常安全和并发+;11及以后:STL实施功能指南

C++11 C+中的异常安全和并发+;11及以后:STL实施功能指南,c++11,exception,concurrency,C++11,Exception,Concurrency,我目前正在学习在C++11及更高版本中处理并发性。作为参考,我选择了一本名为《C++并发操作》(C++concurrency in action)的书,书中提到,当设计并行算法(例如,实现容器中元素的并行累积)时,必须仔细注意异常安全。具体而言,当前结构: template<typename Iterator,typename T> struct accumulate_block { void operator()(Iterator first,Iterator last,T

我目前正在学习在C++11及更高版本中处理并发性。作为参考,我选择了一本名为《C++并发操作》(C++concurrency in action)的书,书中提到,当设计并行算法(例如,实现容器中元素的并行累积)时,必须仔细注意异常安全。具体而言,当前结构:

template<typename Iterator,typename T>
struct accumulate_block
{
    void operator()(Iterator first,Iterator last,T& result)
    {
result=std::accumulate(first,last,result);
    }
};
模板
结构块
{
void运算符()
{
结果=标准::累积(第一个、最后一个、结果);
}
};
如果在以下并行功能中调用:

template<typename Iterator,typename T>
T parallel_accumulate(Iterator first,Iterator last,T init)
{
  // some code....
std::vector<T> results(num_threads);
std::vector<std::thread>  threads(num_threads-1);
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);
        threads[i]=std::thread(
            accumulate_block<Iterator,T>(),
            block_start,block_end,std::ref(results[i]));
        block_start=block_end;
    }

 // more code...

}
模板
T并行_累加(迭代器优先,迭代器最后,T初始)
{
//一些代码。。。。
std::向量结果(num_线程);
标准::向量线程(num_threads-1);
迭代器块_start=first;

对于(unsigned long i=0;我想我对它的理解要好一点:除非绝对确定线程中生成的函数不会抛出,否则最好使用std::future或task进行包装,因为它们会将异常带回调用方,而仅使用std::thread将终止程序。请告知我的unsigned这是正确的。值得感谢的是,许多标准算法可以实现为使用可能重载的简单操作。例如,
std::acculate
可能使用普通加法,如果集合中的类型重载了
operator+
,则重载函数可能会抛出。您需要查找
noe异常
noexcept(真)
用于不应导致抛出异常的函数。@Someprogrammerdude,谢谢。我意识到在发布我的问题后……因此,我想使用std::future或tasks几乎总是在多线程环境中传播异常的一种更干净的方式,并且将继续使用原始线程到最低限度。