2011-12-20 6 views
2

J'ai utilisé le code suivant pour quelques tests maintenant et je n'ai pas rencontré de problèmes, mais je viens juste de me rendre compte que le code pourrait ne pas être thread-safe et conduire à des conditions de rachat.pointeurs partagés et multithread

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

Ma question porte sur la ligne marquée, comme je pense que lors de la construction de copie des racecondititons pointeur partagé pourrait se produire en raison de l'augmentation du referencecount.

Bien que je puisse simplement éviter cela en capturant le pointeur par référence et en l'utilisant directement mais je suis toujours intéressé par la solution.

Répondre

1

Non, si vous compilez avec les options de multithreading activées, la bibliothèque doit utiliser des opérations atomiques ou des verrous pour le nombre de références des pointeurs partagés. Il n'y a pas de problèmes de sécurité de thread avec le code comme vous l'avez posté.

+0

Eh bien, je ne suis pas en train de définir des options spéciales pour le multithreading, juste un lien vers tbb, je compile comme suit: g ++ -std = C++ 0x -Wall -Werror -Wextra -pedantic-erreurs -o main.cpp -btbb – inf

+2

@bamboon: Eh bien, d'après mon expérience, à moins que vous ne donniez l'option '-pthread' à gcc, il ne liera pas correctement les programmes multithread et, dans certains cas, donnera des erreurs lors de la compilation. – Omnifarious

+0

étrange, pourrait-il y avoir quelques changements avec une version de gcc ou que tbb gère en quelque sorte par lui-même? – inf

Questions connexes