Разница между блокировкой (locker) и блокировкой (variable_which_I_am_using)

Названия таблиц и столбцов не могут быть заменены параметрами в PDO.

В этом случае вы просто захотите фильтровать и дезинфицировать данные вручную. Один из способов сделать это - передать сокращенные параметры функции, которая будет выполнять запрос динамически, а затем использовать оператор switch() для создания белого списка допустимых значений, которые будут использоваться для имени таблицы или имени столбца. Таким образом, пользовательский ввод никогда не попадает непосредственно в запрос. Например:

function buildQuery( $get_var ) 
{
    switch($get_var)
    {
        case 1:
            $tbl = 'users';
            break;
    }

    $sql = "SELECT * FROM $tbl";
}

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

30
задан Matt 23 October 2008 в 17:50
поделиться

6 ответов

Опция B использует объект, который будет защищен для создания критического раздела. В некоторых случаях это более ясно передает намерение. Если используется последовательно, это гарантирует, что только один критический раздел для защищенного объекта будет активен за один раз:

lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}
lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}

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

private object m_LockerA = new object();
private object m_LockerB = new object();

lock (m_LockerA)
{
    // It's possible this block is active in one thread
    // while the block below is active in another
    // Do something with the dictionary
}
lock (m_LockerB)
{
    // It's possible this block is active in one thread
    // while the block above is active in another
    // Do something with the dictionary
}

Опция A эквивалентна Опции B при использовании только одного вторичного объекта. До чтения кода намерение B Опции более ясно. При защите больше чем одного объекта Опция B не является действительно опцией.

28
ответ дан Corbin March 23 October 2008 в 17:50
поделиться

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

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

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

11
ответ дан Daniel Plaisted 23 October 2008 в 17:50
поделиться
  • 1
    Я столкнулся со случаем при объединении этого с экраном-заставкой, который вызовет InvalidOperationException - " операция перекрестного потока не valid". добавление a! f. InvokeRequired между f! =null и f. Дескриптор! =null решил вопрос. – Daniel Ballinger 14 February 2011 в 02:17

Это не то, что Вы "Блокируете", это - код, это содержится между блокировкой {...} Это важно и что Вы препятствуете быть выполненными.

, Если один поток вынимает блокировку () на каком-либо объекте, он препятствует тому, чтобы другие потоки получили блокировку на том же объекте, и следовательно препятствует тому, чтобы второй поток выполнил код между фигурными скобками.

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

3
ответ дан Eoin Campbell 23 October 2008 в 17:50
поделиться
  • 1
    Это - ПОТРЯСАЮЩИЙ класс помощника. Работавший, когда ничто иное не сделало. – KeithS 25 August 2012 в 01:44

Я думаю объем переменной, в которой Вы "передаете", определит объем блокировки. т.е. переменная экземпляра будет в отношении экземпляра класса, тогда как статическая переменная будет для целого AppDomain.

Рассмотрение реализации наборов (использующий Отражатель), шаблон, кажется, следует за этим, переменная экземпляра под названием SyncRoot объявляется и используется для всех операций блокировки в отношении экземпляра набора.

2
ответ дан VirtualStaticVoid 23 October 2008 в 17:50
поделиться
  • 1
    Если Вы can' t заставляют курсор обновлять после , медленный код закончил работать тогда you' ре, делающее его неправильно. – Hans Passant 17 November 2013 в 22:57

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

0
ответ дан Mark Cidade 23 October 2008 в 17:50
поделиться
  • 1
    Это, кажется, не верно . Я создал приложение приложения для проверки этого, и кажется, что System.Windows.Cursors.Current обновляется только, когда изменение курсора связано с окном приложения. – Lukasz M 24 June 2012 в 17:17

Ну, это зависит от того, что Вы хотели заблокировать (быть сделанными ориентированными на многопотоковое исполнение).

Обычно я выбрал бы OptionB для обеспечения ориентированного на многопотоковое исполнение доступа к m_Hash ТОЛЬКО. Где как OptionA, я был бы используемый для блокировки типа значения, который не может использоваться с блокировкой, или у меня была группа объектов, которым нужна блокировка одновременно, но я не делаю, что заблокировать целый экземпляр при помощи lock(this)

1
ответ дан faulty 23 October 2008 в 17:50
поделиться
  • 1
    Вы могли бы хотеть изменить вышеупомянутый код на что-то вроде этого: 'Сформируйте f = Форма. ActiveForm; f. Вызовите (() = > {если (f! = пустой указатель & & f. Дескриптор! = IntPtr. Нуль) {//Отправляют WM_SETCURSOR SendMessage (f. Дескриптор, 0x20, f. Дескриптор, (IntPtr) 1); }})'; Это изменение let' s Вы называют HourGlass. Включенный из фонового потока (избегающий перекрестного потока звонит и соответствующее исключение). Sascha – Sascha 4 December 2014 в 07:30
Другие вопросы по тегам:

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