с STL всё же возможны траблы -- например если в одном потоке делаетсе итерирование по всем элементам std::list, а в другом какой-нить элемент удаляется...
то есть такой пример потенциально может вызвать проблеммы:
typedef std::list< std::string > sl;
GuardT< sl > some_list;
void thread1()
{
for( sl::iterator it = some_list->begin();
it != some_list->end();
++it )
{
// ...
}
}
void thread2()
{
while( ( sl::iterator it = some_list->begin() ) != some_list->end() )
some_list->erase( it );
}
А всё почему? Потому что итераторы возвращаются незащищённые. То есть существует вероятность что:
1) thread1 сделает sl::iterator it = some_list->begin();
2) произойдёт threadswitching
3) thread2 сделает первую итерацию цикла -- удалит первый элемент
4) когда очередь дойдёт до thread1 it будет указывать в никуда...