Есть ли способ заблокировать уникальную пару объектов? - PullRequest
0 голосов
/ 05 марта 2020

В C# хорошо документировано, что блокировка на объектах publi c является плохой идеей , потому что мы не знаем, кто еще может заблокировать этот объект, что может вызвать проблемы, такие как взаимоблокировки. Таким образом, мы создаем частные объекты, которые будут служить этими замками. Например, если у нас есть пользовательская коллекция, которая должна иметь возможность изменять элементы в поточно-ориентированном режиме, мы можем захотеть связать уникальный закрытый объект с каждым элементом для блокировки.

Как Например, вместо того, чтобы делать это:

lock (publicObject[i])
{
    // modify publicObject[i]-related data
}

Мы должны делать что-то вроде этого:

var lockObject = GetLockObject(i); // GetLockObject is private
lock (lockObject)
{
    // modify publicObject[i]-related data
}

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

Вместо того, чтобы иметь закрытый объект для блокировки каждого элемента в коллекции, он ' было бы гораздо проще иметь один закрытый объект, который служит «контекстом» для блокировки. Любая другая блокировка для того же объекта publi c, которая также не использует тот же «контекст», не будет блокироваться или блокироваться этим кодом. Если бы я мог сделать что-то подобное, это решило бы проблему не зная, используется ли этот объект в качестве блокировки в другом месте, без необходимости создания уникального объекта блокировки для каждой вещи, которую я хочу заблокировать. Примерно так:

lock (_lockObject, publicObject[i])
{
    // modify publicObject[i]-related data
}

Нам не нужно заботиться о том, блокирует ли что-либо еще вне этого класса publicObject[i], потому что они не будут блокироваться или блокироваться этим фрагментом. Но внутри этого класса, где бы я ни хотел заблокировать publicObject, я вместо этого блокирую пару (_lockObject, publicObject[i]).

Но это, очевидно, не особенность C#, и блокировка на Tuples не делает ' не работает, потому что это типы значений. Есть ли простой способ сделать это в C# на данный момент? И под «простым» я подразумеваю проще, чем поддерживать набор соответствующих объектов для блокировки.

Спасибо!

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