Сигнал вызывающему потоку, что ресурс уже используется - PullRequest
2 голосов
/ 18 мая 2009

Вопрос слегка в аннотации ...
У нас есть ситуация, когда у нас есть структура, к которой могут обращаться два или три потока одновременно.
Мы хотим сообщить потоку, который пытается изменить структуру, если она уже модифицируется.

например. Код на данный момент:

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;
    }
}

1 Ответ

3 голосов
/ 18 мая 2009

Вы используете Windows?

TryEnterCriticalSection

[Редактировать: фиксированная ссылка]

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