2

我现在一直在使用以下代码进行相当多的测试并且没有遇到任何问题,但是我刚刚意识到代码可能不是线程安全的并导致竞争条件。

...
std::shared_ptr<T> ptr(new T(bar));

auto foo = [=] (tbb::blocked_range<int> r) {
     std::shared_ptr<T> p(ptr); // <- Is this threadsafe?
     // ... do stuff
};

tbb::parallel_for(tbb::blocked_range<int>(0,x), foo);
...

我的问题是关于标记线的,因为我认为在共享指针的复制构造过程中,由于引用计数的增加可能会发生竞争条件。

虽然我可以通过引用捕获指针并直接使用它来避免这种情况,但我仍然对解决方案感兴趣。

4

1 回答 1

1

不,如果您在打开多线程选项的情况下进行编译,则库应该使用原子操作或锁来获取共享指针的引用计数。您发布的代码没有线程安全问题。

于 2011-12-20T20:26:56.767 回答