Здравствуйте,
есть два потока и объект "список"
как правильнее организовать критические секции для монопольного доступа к объекту?
делают ли так:
вход в критическую секцию выполняется в методах объекта список
т.е. при любом обращению к методам объекта в его методах выполняется вход в критическую секцию а при завершении метода — выход. При этом как я считаю из другой нити нельзя будет обратится к методам этого объекта (так ли это?)
Здравствуйте, butcher, Вы писали:
B>вход в критическую секцию выполняется в методах объекта список B>т.е. при любом обращению к методам объекта в его методах выполняется вход в критическую секцию а при завершении метода — выход.
Совершенно верно
B>При этом как я считаю из другой нити нельзя будет обратится к методам этого объекта (так ли это?)
Нельзя это слишком сильно сказано. Просто пока один поток работает находится внутри метода работы со списком, другой будет висеть на вызове метода, пока первый не вызовет LeaveCriticalSection.
Да и так и так можно. Смотря кто обеспечивает потокобезопасность. Если объект "список" то вставлять такие вызовы в каждом методе. Во втором случае ты ограничиваешь доступ к объекту в целом и такие вызовы должен будешь ставить для каждого обращения к нему. Вопросы дизайна. В первом случае — потокобезопасный класс, во втором — соответсвенно нет.
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
B>т.е. при любом обращению к методам объекта в его методах выполняется вход в критическую секцию а при завершении метода — выход. При этом как я считаю из другой нити нельзя будет обратится к методам этого объекта (так ли это?)
Как раз так и надо. У тебя получится потокобезопасный объект, который сможет использовать любое приложение.
На самом деле тут есть "подводные камни". Если у тебя есть ф-я для доступа к элементу списка типа Get, и она возвращает ссыку, или указатель на данные хранящиеся в списке, то своей критической сецией внутри ф-ии Get ты не обезопасешь себя, так как после выхода из этой ф-ии доступ до списка получит другой поток и сможет удалить элемент содержащий данные на которые ты ранее получил ссылку, и данные могут быть разрушены. Поэтому в таких случаях для списка делается методы Lock и Unlock и пишется:
list.Lock();
Object &obj=list.Get();
// чего-то делаем с obj
list.Unlock();
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.