Вопрос слегка в аннотации ...
У нас есть ситуация, когда у нас есть структура, к которой могут обращаться два или три потока одновременно.
Мы хотим сообщить потоку, который пытается изменить структуру, если она уже модифицируется.
например. Код на данный момент:
thread0: struct->modify(var SomeNewState)
thread1: struct->modify(var SomeNewState)
thread2: struct->modify(var SomeNewState)
void struct::modify(var SomeNewState) {
EnterCriticalSection(&criticalSection);
change some state...
LeaveCriticalSection(&criticalSection);
}
Мы хотели бы, чтобы struct::modify()
немедленно возвратился, чтобы указать, используется ли критический раздел. То есть мы не хотим, чтобы другие потоки ожидали этого критического раздела .
Причина, по которой нам нужно это сделать, заключается в том, что первый поток «выигрывает», и мы не хотим, чтобы другие потоки ожидали в том состоянии, которое затем устарело. Пока вызовы не являются одновременными, состояние является действительным (состояния помещаются в очередь в другом месте). Смена состояния не является длительной операцией, но имеет реальные последствия, которые могут занять много времени (3-4 с).
EDIT:
Решение это что-то вроде этого.
int struct::modify(var SomeNewState) {
if(TryEnterCriticalSection(&criticalSection)) {
change some state...
LeaveCriticalSection(&criticalSection);
return 0;
}
else {
return 1;
}
}