C++ TBB冻结中的并行执行

C++ TBB冻结中的并行执行,c++,tbb,C++,Tbb,这就是问题所在。我有一段代码,当只在一个线程中执行时,它可以完美地工作。但是一旦用TBB调用了这段代码,它就冻结了(或者我没有耐心等待它完成!) 代码太长,但想象一下: class TBB_Test { public: TBB_Test(void) { /* initialize the stuff */ } void operator() (tbb::blocked_range<int> &r) const { for (int i = r.begin

这就是问题所在。我有一段代码,当只在一个线程中执行时,它可以完美地工作。但是一旦用TBB调用了这段代码,它就冻结了(或者我没有耐心等待它完成!)

代码太长,但想象一下:

class TBB_Test
{
public:
  TBB_Test(void) { /* initialize the stuff */ }

  void operator() (tbb::blocked_range<int> &r) const
  {
    for (int i = r.begin(); i != r.end(); ++i)
    {
      // compute very awesome stuff!
    }
  }
};
类TBB_测试
{
公众:
TBB_测试(void){/*初始化内容*/}
void运算符()(tbb::blocked_range&r)常量
{
for(int i=r.begin();i!=r.end();++i)
{
//计算非常棒的东西!
}
}
};
所以,当我按顺序执行它时:

TBB_Test() (tbb::blocked_range<int>(0, max_value));
TBB_测试()(TBB::阻塞_范围(0,最大值));
它起作用,但有一次是并行的:

tbb::parallel_for(tbb::blocked_range<int>(0, max_value, grainsize), TBB_Test());
tbb::parallel_for(tbb::blocked_range(0,max_值,grainsize),tbb_Test());
它冻结了,而不是比顺序的更快

什么会导致这样的事情?两个线程试图在同一位置读写?在我们的情况下,写作不应该发生!还有一种情况是,同一个地址可能被多个线程读取,并且不会冻结

有什么想法吗


在VStudio中,至少在调试时,只要激活调试器,调试器就会在各种异常情况下停止。。。很长,但这是正确的方法

很自然,这是一个内存分配问题

糟糕的解决方案是在分配内存的地方使用互斥。这是不好的,因为最终你的X处理器运行到最大。。。主要是等待互斥

我们使用的最后一种方法是,每个片都有一个内存分配方案。然后,通过使用“连接”,我们在计算数据后将其合并在一起。这样,处理器在没有任何互斥锁的情况下运行。但这会导致需要更多的内存。但只要线程之间没有重复,您就应该没事了


所以,吸取了教训

当人们使用像“tbb”这样的“tla”时,我会使用“wtf”;)PS:你有没有在调试器下处理过这些问题?当它“冻结”时,它是否处于无限循环中?此 路 不通?僵局?您的线程可能会踩到哪些全局变量?Etc Etc VS中的默认调试器无法捕获任何错误。。。我不知道该怎么做,我也不知道该怎么做!我现在将问题隔离到单个函数调用。还在分析。。。但也希望通过TBB学习更多技巧!所以,如果你通过检查一个特定的东西来解决一个类似的问题,它可能会有帮助!显然地在并行过程中,会抛出一个异常,因为并行代码本身没有try/catch,所以可能会抛出并丢失它!所以,TBB不能作为例外证明。如果您回答自己的问题来解释什么是错误的,以及您是如何发现和修复的,那将是一件好事。这样的话,你可能会帮助有类似问题的人,也可能获得一些选票。