2017-01-03 10 views
1

Это сценарий обработки исключений в многопоточном сценарии. Несколько потоков работают параллельно на некотором общем ресурсе, заблокированном при взаимном исключении, когда это необходимо. Если один поток обращается к исключению, могу ли я использовать sem_trywait, чтобы проверить, ожидает ли какой-либо другой поток в семафоре, и если я найду какой-нибудь поток, ожидающий семафора, будет использовать флаг, в котором произошло исключение, и я выведу sem_post, чтобы ожидающий поток может не дождаться и проверить, произошло ли какое-то исключение, прежде чем продолжить. В случае возникновения исключения другой поток, который в противном случае ожидался, теперь будет идти к изящному выходу. Пожалуйста, предложите. Мои фактические qs: могу ли я использовать sem_trywait?Как проверить в C Posix поток, если кто-то ждет на общем семафоре?

+1

Какой у вас вопрос? –

+0

@ammoQ, могу ли я использовать sem_trywait для проверки ...? –

+1

Все, что нужно сделать, это либо получить семафор, либо нет. Он не говорит вам, ждет ли он этого. – wallyk

ответ

2

Наиболее простым решением было бы установить дополнительный механизм состояния резьбы. Семафоры не предназначены для обозначения того, ждет ли их кто-либо.

В глобально видимой переменной, которая записывается только нити, установите его — сказать 1 — если какой-то поток ждет семафор и 0, если нет. Если кто-то хочет знать, хочет ли поток получить семафор, проверьте состояние переменной. Не должно быть слишком сложно обрабатывать условия гонки, задавая переменную, упорядочивая операции правильно.