Можно использовать переменную CRITICAL_SECTION для получения взаимного исключения.
Мой вопрос: CRITICAL_SECTION поддерживает копирование? Если я передаю один значением к другому потоку, я могу знать наверняка, что взаимное исключение будет работать?
Я не был бы удивлен, ли ответ, "Вы не можете сделать этого", но было бы хорошо иметь своего рода официальное подтверждение. Я не смог найти оператор так или иначе в документации.
Нет. Не удается скопировать CRITICAL_SECTION
. MSDN явно заявляет об этом :
Объект критического раздела не может быть перемещен или скопирован.
Быстрый поиск по заголовкам показывает, что структура определена в winnt.h
, и это определение явно указывает на то, что копирование структуры не сработает.
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
//
// The following three fields control entering and exiting the critical
// section for the resource
//
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
Тем не менее, я понятия не имею, почему эти внутренние счетчики хранятся в структуре пользовательского пространства, т.е. что произойдет, если программа их изменит?