Вопрос по lock(object)

  • Автор темы Автор темы ZSharp
  • Дата начала Дата начала

ZSharp

Client
Регистрация
29.09.2013
Сообщения
426
Реакции
136
Баллы
43
Всем привет.
Кто хорошо знает C#, объясните плиз.
Может кто-то сталкивался с таким вопросом?

Блокировка файла для многопотока
Code:
Развернуть Свернуть Копировать
public static object lockFile1 = new object();
public static object lockFile2 = new object();
public static object lockFile3 = new object();

lock (lockFile1)
{ some code File1 }

lock (lockFile2)
{ some code File2 }

lock (lockFile3)
{ some code File3 }

А можно ли передавать имя объекта lock в переменной?
То есть вот так

Code:
Развернуть Свернуть Копировать
public static object lockFile1 = new object();
public static object lockFile2 = new object();
public static object lockFile3 = new object();

string nameLock = "lockFile1";

lock (nameLock)
{ some code File1 }

nameLock = "lockFile2";

lock (nameLock)
{ some code File2 }

nameLock = "lockFile3";

lock (nameLock)
{ some code File3 }

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

от того что вы объявили переменную nameLock типа string и присвоили ей значение "lockFile1" она ни каким боком не превратилась в объект типа файл.
поэтому таким образом лочится только локальная переменная , которая и так никому не доступна кроме этой процедуры.
 
string nameLock = "lockFile1"; lock (nameLock)
Нет, так если и работает, то только благодаря оптимизации строковых в среде выполнения:
В особенности избегайте использования следующих объектов в качестве объектов блокировки:
строковых экземпляров, включая строковые литералы, так как они могут быть интернированы.
т.е. для разных Thread'ов, объект должен быть один, а значит static, желательно readonly. В случае со строковыми самое надёжное - константы.
Списки/таблицы зенки можно блочить ими же.
 
  • Спасибо
Реакции: ZSharp

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)