Можно ли передать право собственности на мьютекс, критическую секцию и т. д. от первого потока второму потоку, не позволяя тем временем какому-либо третьему потоку захватить право собственности? документация по критической секции запрещает вызывать LeaveCriticalSection в потоке, отличном от того, который вызвал EnterCriticalSection:
Если поток вызывает LeaveCriticalSection, когда он не владеет указанным объектом критической секции, возникает ошибка, которая может привести к тому, что другой поток, использующий EnterCriticalSection, будет ожидать бесконечно.
Но в моем сценарии мне нужно точно освободить объект синхронизации в потоке, отличном от того, который его получил, чтобы ни один другой (третий) поток не мог получить право собственности на объект синхронизации в то же время (с момента получения первый поток до момента освобождения вторым потоком). Для моих нужд подойдет решение с потоковой передачей C++ или вызовами WinAPI.
std::move
не должно работать? - person deW1   schedule 10.11.2015std::move
, но, похоже, не позволяет перемещать мьютекс между потоками). - person Serge Rogatch   schedule 10.11.2015But in my scenario I need to exactly release the synchronization object in a different thread than the one who acquired it
- Критическая секция просто не предназначена для такого использования. Вы можете использовать другой механизм синхронизации, например, semaphore: у него нет семантики ownership, поэтому он может быть освобожден любым потоком. - person Tsyvarev   schedule 10.11.2015