2013-12-10 5 views
-2

У меня есть класс в моем проекте, который содержит 4 вектораThread дизайн синхронизации

m_vecA; 
m_vecB; 
m_vecC; 
m_vecD; 

Эти векторы могут быть доступны в различных threads.I может использовать одну критическую секцию и защищать все эти векторы с ним.

Или это хорошая идея иметь 4 критических раздела по одному для каждого ресурса? Если я использую один критический раздел для всех ресурсов, я вижу проблему взаимоблокировки.

Как правило, хороший дизайн имеет один критический раздел для одного ресурса или у нас есть один критический раздел для каждого класса?

+0

Один nitpick. Критический раздел не для ресурса - критический раздел - это ДОСТУП к этому ресурсу. – polkadotcadaver

ответ

2

Есть 4 критических секций, но:

Хитрость заключается в том, чтобы всегда доступа (блокировка) их в том же порядке,

say A then B then C then D 

В противном случае вы можете тупиковой, если:

thread one locks A and is waiting for B, 

and thread 2 locks B and is waiting on A 

Этого не может произойти, если вы выполняете заказ критического раздела

+0

@polkadotcadaver Я думаю, что это все еще хорошее общее правило большого пальца совет! –

2

У вас должен быть один критический раздел для каждого элемента, к которому необходимо получить доступ одновременно.

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

+1

Вы можете избежать тупиковой ситуации, введя порядок блокировки. Если вы держите замок на что-то, тогда вы должны приобрести блокировку с более высоким номером заказа. Если все блокировки освобождены, вы можете снова заблокировать что-либо. – Notinlist

1

Если у вас есть 4 se parate, независимые ресурсы, и не имеет значения, что они содержат в отношении друг к другу, вы, вероятно, захотите защитить их отдельно и независимо.

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

Или это хорошая идея иметь 4 критических раздела по одному для каждого ресурса? Если я использую один критический раздел для всех ресурсов, я вижу тупик .

Как уже упоминалось в других ответах, это произойдет, если вы потоки блокировки более одного ресурса в то время и не всегда захватывая их в же порядке.

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

Как правило, хороший дизайн имеет один критический раздел для одного ресурса или у нас есть один критический раздел в классе?

Это снова зависит от того, представляет ли каждый вектор полностью независимый ресурс, или все 4 вектора, как группа, являются одним логическим ресурсом. Тот факт, что вы положили их в класс вместе, кажется, указывает на последнее.Если это так, вы должны иметь единый замок, защищающий все их как группу.