Я хотел бы подтвердить здесь, правильно ли я понял, как работают TCriticalSection
и Synchronize
.
Насколько я знаю прямо сейчас Synchronize
использует SendMessage
(обновление: или, по крайней мере, использовал его в более старых версиях VCL, как указано в нескольких комментариях ниже), который приостанавливает выполнение текущего потока (а также любого другого потока), в отличие от PostMessage
, который этого не делает и затем выполняет требуемую функцию (из основного потока). В некотором смысле SendMessage
"останавливает" многопоточность при выполнении.
Но насчет TCriticalSection
я не уверен. Скажем, например, я создаю что-то вроде этого:
// Global variables somewhere in my code any thread can access
boost::scoped_ptr<TCriticalSection> ProtectMyVarAndCallFnction(new TCriticalSection);
int MyVariable1;
void CallMyFunctionThatAlsoModifiesMoreStuff() { /* do even more here */ };
// Thread code within one of the threads
try {
ProtectMyVarAndCallFnction->Acquire();
MyVariable1++;
CallMyFunctionThatAlsoModifiesMoreStuff();
}
__finally {
ProtectMyVarAndCallFnction->Release();
}
Теперь у меня вопрос - как критический раздел «знает», что я защищаю MyVariable1 в этом случае, а также все, что вызываемая функция может изменить?
Если я правильно понял - это не так - и я обязан правильно вызвать Acquire () в любом потоке, который хочет изменить MyVariable1 или вызвать эту функцию (или выполнить любое из двух). Другими словами, я думаю о TCriticalSection
как о пользовательском блоке, который определяет все, что я ему логически присвоил. Это может быть набор переменных или любая конкретная функция, если я вызываю Acquire () внутри всех потоков, которые могут писать в этот блок или использовать эту функцию. Например, «DiskOp» может быть моим именем TCriticalSection
, который записывает на диск, «Интернет» может быть именем TCriticalSection
, который вызывает функции, которые получают некоторые данные из Интернета. Я правильно понял?
Кроме того, в этом контексте всегда ли TCriticalSection должен быть глобальной переменной?
Synchronize
не используетSendMessage
. - person kludg   schedule 03.12.2012SendMessage
для реализацииSynchronize
. - person kludg   schedule 03.12.2012