2013-12-23 4 views
1

Я знаю, что мы можем обнаруживать и преодолевать условия гонки, применяя взаимное исключение с использованием переменных атомной блокировки, но есть ли способ обнаружить состояние гонки без реализации взаимного исключения?Обнаружение условий гонки без осуществления взаимного исключения

Взаимное исключение увеличивает накладные расходы до большого количества, поэтому я думал о способе преодолеть условия гонки без каких-либо дополнительных накладных расходов.

ответ

1

Синхронизация не требует значительного увеличения накладных расходов. Обычно существуют довольно дешевые подходящие способы решения проблемы. Если у вас возникли проблемы с этим, если вы публикуете подробные сведения о своем сценарии и какие методы синхронизации вы используете для его защиты, мы можем предложить некоторые предложения.

Чтобы избежать необходимости синхронизации, действительно нет хорошего способа. Это проблема, с которой вам приходится иметь дело в параллельном программировании. Во многих случаях вы можете полностью отказаться от нескольких потоков, а в других случаях вы можете максимально изолировать потоки и уменьшить необходимость синхронизации в нескольких критических местах. Например, во многих случаях мне нравится использовать концепцию потока сообщений, в которой у меня есть один поток, ответственный за весь бухгалтерский учет и доступ к данным. Затем рабочие потоки отправляют сообщения в этот поток (используя синхронизированную очередь) для обработки. Это означает, что мне нужно предоставить только синхронизированную очередь сообщений, и все остальные операции могут выполняться независимо.

Надеюсь, это поможет! Не стесняйтесь публиковать некоторые подробности, если вы хотите более конкретные идеи/предложения.

+0

Ваше упоминание о «синхронизированной очереди» может быть лучше объяснено. В примере с очередью сообщений хорошим кандидатом является LinkedBlockingQueue, который использует блокировки, не синхронизированные. Случайный читатель, скорее всего, полагает, что вы намерены «синхронизировать» в методах очереди. – javadba

+0

@javadba Хорошее разъяснение, спасибо. В C# получатель {'Queue.Synchronized'] (http://msdn.microsoft.com/en-us/library/system.collections.queue.synchronized%28v=vs.110%29.aspx) может использоваться для создайте потокобезопасную оболочку вокруг «очереди». – TypeIA

Смежные вопросы