ここで問題です。1 つのスレッドのみで実行すると完全に機能するコードがあります。しかし、このコードが 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_Test() (tbb::blocked_range<int>(0, max_value));
それは機能しますが、一度並行して:
tbb::parallel_for(tbb::blocked_range<int>(0, max_value, grainsize), TBB_Test());
シーケンシャルよりも高速ではなく、フリーズしました。
何がそのようなことを引き起こす可能性がありますか? 2 つのスレッドが同じ場所で読み書きしようとしていますか? 私たちの場合、書き込みは起こらないはずです! また、同じアドレスがおそらく複数のスレッドによって読み取られ、フリーズしないという別の状況もあります!
何か案が?
VStudioでは、少なくとも、デバッグ時にアクティブ化するだけで、デバッガーはあらゆる種類の例外で停止します...長いですが、正しい方法です!