Пытаясь создать потокобезопасный контейнерный класс с нуля, я столкнулся с проблемой возврата значений из методов доступа. Например в Windows:
myNode getSomeData( )
{
EnterCriticalSection(& myCritSec);
myNode retobj;
// fill retobj with data from structure
LeaveCriticalSection(& myCritSec);
return retobj;
}
Теперь я предполагаю, что этот тип метода вовсе не потокобезопасен, потому что после того, как код освобождает критическую секцию, другой поток может прийти и немедленно перезаписать retobj
до того, как первый поток вернется. Итак, каков элегантный способ вернуть retobj
вызывающему объекту потокобезопасным способом?
retobj
должен быть в стеке, и каждый поток должен иметь свой собственный стек. Подобные условия гонки более распространены, когда вы работаете с предварительно выделенной памятью и должны заблокировать доступ, чтобы предотвратить совместное использование. - person ssube   schedule 25.07.2012