Скажите плз. где почитать как в С++ классах можно организовать потокобезопасность доступа к членам. Или как это делается?
Здравствуйте, <Аноним>, Вы писали:
А>Скажите плз. где почитать как в С++ классах можно организовать потокобезопасность доступа к членам. Или как это делается?
С++ в чистом виде не поддерживает потоки. Потоки зависят от того в какой ОС ты работаешь, и какими средствами разработки ты пользуешься, если юзаешь винду, можешь почитать MSDN.
... << Rsdn@Home 1.1.4 beta 1 >>
Здравствуйте, ГлубокоПреУважаемыйГосподин Аноним, Вы писали:
А>Это я понимаю, в Винде есть процессы и потоки. Дак вот WinApi потоки + С++ код -> как это делается в классах? Я слышал, что STL какая-то имеет потокобезопасные классы, это правда? Где поконкретнее в MSDN найти это место?
Точно также как Pascal + WinApi или Basic + WinApi или X86 Assembler + WinApi

Существуют конечно разные библиотеки и обертки, чтобы один и тот же код компилировался на совсем разных платформах, но в данном случае это к делу не относится.
Есть стандартные объекты синхронизации.
Критические секции, в особенности, так как они довольно быстрые.
Соответственно в MSDN это раздел Synchronization в Platform SDK -> DLLs, Processes, and Threads
Ну а у вас есть полностью инкапсулированные классы, не имеющие открытых членов, а только методы, возвращающие исключительно константные ссылки и указатели. А дальше для каждого конкртеного случая вы пишете обработку многопточного доступа.
Чтобы этим проникнуться достаточно поискать в исходниках MS CRtl макроопределение _MT
Исходники у меня лежат вот по такому пути Program Files\Microsoft Visual Studio .NET 2003\Vc7\crt\src\*.*
А>Дак вот WinApi потоки + С++ код -> как это делается в классах?
local
online
В простом случае используется Critical Secion или Mutex. Перед входом в код (метод), который может выполняться из разных потоков, пытаешься завладеть объектом синхронизации. Так как системой гарантируется владение объектом только одному потоку, то и последующий код будет выполняться только одним потоком в данный момент:
class A
{
method m
{
criticalsection.enter
// здесь гарантировано доступ только одному потоку
criticalsection.leave
}
}
В объекном виде Critical Secion и Mutex можешь взять из ATL библиотеке (смотри файл atlsync.h).