Что точно означает соединять объект?

Altough, который я использую, привязывает мое приложение, я не понимаю то, что точно делает соединяющийся конкретный ссылочный тип. Я думал, что это просто останавливает поток, пока содержание {} не закончено. Но я считал, что блокировка (этого) плоха, если ее общественность - почему? Статья объяснила это, но я не понимаю шестерку, я не знаю то, что произошло с самим объектом, заблокированным. Например, что, если я использую блокировку (это) и от другого потока называет его метод? Я думал, что только код под блокировкой защищен, или я буду не мочь получить доступ к заблокированному объекту вообще?Спасибо

6
задан Thomas 1 January 2010 в 09:00
поделиться

4 ответа

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

Идея, похоже, должна сначала сделать случайный путь, выбирая начальный узел случайным образом и исходя из этого, выбрав случайные соседи до тех пор, пока это возможно. Когда больше никаких соседей не может быть выбрана, либо путь является гамильтонианом, либо не так. Если это не так, это последний узел на пути имеет какой-то сосед уже на пути (см. Ниже), поэтому поворот означает сделать край от последнего узла к соседу уже на пути и удалять одну из ссылок из сосед, который был выбран для пути. Затем есть новый конец пути, из которого процесс продолжен.

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

-121--3665417-

int_fast # _t из или .

, которые сказали, что вы откажетесь от простоты и последовательности (например, эти типы могут быть типа символов, например, которые являются целочисленными типами в C / C ++, и которые могут привести к удивительным разрешениям функций) вместо того, чтобы просто использовать INT Отказ

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

Он будет использоваться на процессоре X86 и полностью хранится в оперативной памяти. Должно быть, довольно большое количество нужно будет храниться (50 000+), поэтому процессор кэширует и такое необходимо учитывать.

Вы все равно должны беспокоиться о кэше ( после , вы на этом уровне оптимизации), даже если все данные не будут кэшироваться. Например, вы получаете доступ к каждому элементу в последовательности? непредсказуемо? Или только одно поле из каждого элемента в последовательности? Сравнить struct {int a, b; } Данные [n]; - - INT Data_a [n], data_b [n]; . (Представьте, что вам нужно все «A» сразу, но может игнорировать другой, какой путь больше кэша будет дружелюбным?) Опять же, это не звучит как главная область, на которой вы должны сосредоточиться.

-121--3049948-

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

Я думал, что просто останавливает нить, пока содержимое {} не закончено.

Хорошо, блокировка Он останавливается Другое Другое Нитки , от приобретения блокировки, пока замок не будет выпущен, что наиболее часто находится в конце блокировки (Но это также может быть монитор . Wait ).

Блокировка (это) использование (это) использование опасно, потому что блокировка сложна, и понимание точно, какие потоки блокируются, какие объекты (ы), в какое время очень важно, чтобы избежать тупиков; Однако, если вы замок (это) , вы не контролируете другие потоки, которые могли бы также быть (неожиданно) блокировкой одного и того же объекта. Он гораздо безопаснее использовать частное поле для блокировки.

В качестве примера, если у вас есть (в синхронизированном списке):

private IList<T> innerList = ...
public int Count { get { lock(this) { return innerList.Count; } } }

, то не сложно представить еще один код также , имеющий ссылку на этот синхронизированный список и блокировки на Это, например:

SyncList<T> list = ...
lock(list) { // lock for atomicity
    if(!list.Contains(value)) list.Add(value);
}

, который является потенциальным тупиком; Было бы намного лучше, если бы подсчет не было блокировку (это) , но заблокирован частный объект, то есть.

private readonly object syncLock = new object();
public int Count { get { lock(syncLock) { return innerList.Count; } } }

Теперь нет риска этого вопроса. Еще одна проблема состоит в том, что оба поля, подобные полями, так и [MOSTOMPL] заметки блокировку . Блокировка на типе (для статических методов) одинаково опасна для одинаковых причин.

8
ответ дан 8 December 2019 в 13:46
поделиться

Когда вы используете lock(someObject) { ...code... } это означает только тогда, когда поток может одновременно находиться внутри заблокированного региона (предполагая, что вы всегда блокируете один и тот же объект!). Второй поток, пытающийся войти в регион, будет заблокирован и должен подождать, пока первый поток не уйдет. Если у вас есть две блокировки (someObject) { } регионов, блокирующих один и тот же объект, только один поток может войти в любой из этих регионов.

Блокировка обычно является реализацией, которую следует держать в тайне. Плохая идея блокировки на публичном члене, потому что это означает, что клиенты вашего класса также могут блокироваться на этом же объекте, и это может привести к тупиковым ситуациям или ненужному замедлению. Блокировка на this плохая по той же причине.

Создайте новый закрытый объект и заблокируйте его.

1
ответ дан 8 December 2019 в 13:46
поделиться

Сам объект не заблокирован. Считайте, что каждый объект имеет -связанный с замок (или -монитор ). Когда один поток получил блокировку, ни один другой поток не может получить ее без освобождения первого потока, либо вызовом Monitor.Exit (что происходит в конце оператора блокировки lock), либо вызовом Monitor.Wait. Поток, вызывающий Monitor.Enter для получения блокировки, будет блокирован до тех пор, пока не сможет получить блокировку.

Сам объект вообще не "защищен" - блокировки, по сути, являются рекомендательными.

Причина отсутствия блокировки на "this" заключается в том, что вы не знаете, какой другой код имеет ссылку на "this". Для правильной блокировки необходимо знать, в каких ситуациях поток будет или не будет владеть блокировкой - и вы не можете знать, что если код, не контролируемый вами, может вывести блокировку. Исключение составляют случаи, когда вы выставляете ссылку с явной целью совместного использования блокировки (как, например, свойство SyncRoot в коллекциях .NET 1.1).

7
ответ дан 8 December 2019 в 13:46
поделиться

Блокировка объекта ничего не делает с самим объектом - это просто означает, что любой другой поток, пытающийся заблокировать тот же самый объект, будет остановлен до тех пор, пока блокирующий поток не освободит его. Причина, по которой блокировка(this) игнорируется, заключается в том, что другой код, находящийся вне объекта, также может заблокировать объект и тем самым помешать его нормальной работе.

1
ответ дан 8 December 2019 в 13:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: