ОК, чтобы скопировать CRITICAL_SECTION? - PullRequest
8 голосов
/ 17 июля 2010

Можно использовать переменную CRITICAL_SECTION, чтобы получить взаимное исключение.

Мой вопрос: поддерживает ли CRITICAL_SECTION копирование?Если я передам одно значение другому потоку, могу ли я точно знать, что взаимное исключение будет работать?

Я не удивлюсь, если ответ «ты не сможешь этого сделать», но было бы неплохо получить какое-то официальное подтверждение.Я так и не смог найти заявление в документации.

Ответы [ 2 ]

12 голосов
/ 17 июля 2010

Нет. A CRITICAL_SECTION не может быть скопировано. MSDN прямо заявляет об этом :

Объект критической секции не может быть перемещен или скопирован.

1 голос
/ 17 июля 2010

Быстрый поиск по заголовкам показывает, что структура определена в 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;

Тем не менее, у меня естьПонятия не имею, почему эти внутренние счетчики хранятся в структуре пространства пользователя, т.е. что произойдет, если программа их модифицирует?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...