общие указатели и многопоточность - PullRequest
2 голосов
/ 21 декабря 2011

Я уже использовал следующий код для некоторого тестирования и не сталкивался с какими-либо проблемами, однако я только что понял, что код может быть не поточно-ориентированным и приводить к условиям гонки.

...
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);
...

Мой вопрос касается помеченной линии, так как я думаю, что при копировании конструкция общего указателя может происходить из-за увеличения ссылочного значения.

Хотя я мог бы просто избежать этого, захватив указатель по ссылке и используя его напрямую, но я все еще заинтересован в решении.

1 Ответ

1 голос
/ 21 декабря 2011

Нет, если вы компилируете с включенными параметрами многопоточности, библиотека должна использовать атомарные операции или блокировки для подсчета ссылок совместно используемых указателей. Нет проблем безопасности потока с кодом, который вы опубликовали.

...