Вы можете (вроде) имитировать попытку с тайм-аутом, используя TryEnterCriticalSection
, но по большей части, если вы хотите тайм-аут, вам может быть лучше использовать mutex
вместо этого (когда вы приступите к этому критическая секция - это, в основном, обертка вокруг мьютекса).
Другой возможностью было бы использование библиотеки Win32 pthreads , которая, вероятно, позволит компилировать ваш код Linux под Win32 без изменений (и вы просто удалите свой собственный код Win32).
Это очень похоже на поддержку потоков, которая была добавлена в библиотеку C ++ 0x, хотя она не (даже не пытается) точно следовать новому стандарту. Если вы хотите следовать стандарту, вы можете использовать библиотеку Энтони Уильямса Just Thread (предупреждение: по разумной цене, но не в любом смысле бесплатно).
Редактировать (в ответ на вопросы Билли О'Нила): Если подумать об этом, на самом деле - это легко доступный исходный код , который показывает большую часть происходящего. Структура данных CRITICAL_SECTION определена в winbase.h как определение типа RTL_CRITICAL_SECTION. Это, в свою очередь, определяется в 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;
Если память служит, основная идея о том, как это используется, работает примерно так:
- Если этот поток уже владеет критической секцией, увеличьте RecursionCount и верните
- В противном случае, SpinCount пытается ввести CS по быстрому пути, используя атомные операции на LockCount
- В противном случае подождите на LockSemaphore