powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как именно происходит блокировка (lock)?
13 сообщений из 38, страница 2 из 2
Как именно происходит блокировка (lock)?
    #38764467
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvskyANAПростите, но с логикой у Вас слабовато. Впрочем как и у многих новичков.Не хамите.

Забавно это читать именно от вас
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764479
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAСвеном, отвали, не тебе меня манерам учить.Хамство вас не красит ни разу.
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764489
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAskyANAпропущено...
Простите, но с логикой у Вас слабовато. Впрочем как и у многих новичков.

У Вас вылетает исключение "Collection was modified; enumeration operation may not execute", которое явно говорит о том, что в процессе того как поток #1 читал данные, поток #2 изменил коллекцию и #1 не может продолжить чтение.

Даже если бы lock работал по Вашей логике, то чтобы от этого изменилось?
Поток #1 "замрёт", пока #2 изменяет коллекцию, "отомрёт" и возникнет таже самая ситуация: "Collection was modified; enumeration operation may not execute".

Вместо того, чтобы фантазировать, Вам следует прочитать комментарий от Pallaris ( 16647244 ) и заключить фрагмент кода чтения, и фрагмент кода изменения коллекции в
Код: c#
1.
2.
3.
4.
lock (одинИтотЖеObject)
{
   // Кусок кода
}

Тогда поток #2 подождёт пока поток #1 прочитает коллекцию, прежде чем её изменять.
Ну или наоборот: #1 подождёт пока #2 изменит коллекцию, прежде чем читать. В зависимости от того, кто первый начнёт выполнять свой кусок кода.
Так ?
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764492
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42Меня смущает то, что почему-то lock делается на объекте, а блокируется секция кода. А зачем объект-то нужен, если он сам по себе не блокируется?

Воспринимайте это как эстафету. В руки передали флажок, ты бежишь, выполняешь какие то квесты (алгоритм/код), возвращаешься, передаешь флажок (объект для lock) следующему участнику. Естественно, пока участники договорились считать наличие флажка стартом для работы.
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764496
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79НемоКэп42Меня смущает то, что почему-то lock делается на объекте, а блокируется секция кода. А зачем объект-то нужен, если он сам по себе не блокируется?

Воспринимайте это как эстафету. В руки передали флажок, ты бежишь, выполняешь какие то квесты (алгоритм/код), возвращаешься, передаешь флажок (объект для lock) следующему участнику. Естественно, пока участники договорились считать наличие флажка стартом для работы.
Ну, типа того. Мне тут накидали ссылок на статьи, где этот thisLock объясняется - сейчас почитаю...
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764508
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42Arm79пропущено...


Воспринимайте это как эстафету. В руки передали флажок, ты бежишь, выполняешь какие то квесты (алгоритм/код), возвращаешься, передаешь флажок (объект для lock) следующему участнику. Естественно, пока участники договорились считать наличие флажка стартом для работы.
Ну, типа того. Мне тут накидали ссылок на статьи, где этот thisLock объясняется - сейчас почитаю...

Да что его читать. thisLock - совершенно любой объект. Главное, чтобы все участники его видели. Также для класса можно написать lock(this)

Обычно для флажка используют новосозданный самый простой объект - new Object(), просто чтобы исключить внешнее влияние и взаимоблокировки (вариант с this имеет подводные камни, поэтому я его не советую, у не threadsafe-коллекции есть SyncRoot )
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764515
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Также для класса можно написать lock(this)
Но не нужно:
In general, avoid locking on a public type, or instances beyond your code's control. The common constructs lock (this), lock (typeof (MyType)), and lock ("myLock") violate this guideline:
lock (this) is a problem if the instance can be accessed publicly.

lock (typeof (MyType)) is a problem if MyType is publicly accessible.

lock("myLock") is a problem because any other code in the process using the same string, will share the same lock.

Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances.

http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764533
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныArm79Также для класса можно написать lock(this)
Но не нужно:



Спасибо, я знаю:
Arm79вариант с this имеет подводные камни, поэтому я его не советую
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764631
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще надо по замку начинать с monitor_ov, что бы знать как леденцы устроены,
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764748
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор: Просьба всем успокоиться и продолжить выяснение как именно происходит блокировка (lock)
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38764769
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42Ну, типа того. Мне тут накидали ссылок на статьи, где этот thisLock объясняется - сейчас почитаю...

Простой пример, попробуй выполнить с локами и без локов, посмотри результат
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        public static object _syncRoot = new object();

        public static void Common(string str)
        {
            for (int i = 0; i < 5; i++)
            {
                Thread.Sleep(1);
                Console.WriteLine(str);
            }
        }
        public static void Method1()
        {
            lock (_syncRoot)
                Common("Method1"); 
        }

        public static  void Method2()
        {
            lock (_syncRoot)
                Common("Method2"); 
        }
        static void Main(string[] args)
        {
            Task.Factory.StartNew(() => { Method1(); });
            Task.Factory.StartNew(() => { Method2(); });
            Console.ReadLine();
        }
    }
}
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38765000
mikron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПри помощи lock фрагмент кода помечается как критическая секция. То есть блокируется не объект, а кусок кода.


Чудесато здесь. А после этой строчки у меня вобще волшебное чувство как у Алисы в стране чудес. В этом топике болше не может быть конструктива.
Предлогаю вапше локи запретить как язычество. И переменные обьявлять только как волатиле. А сособо важные даже статик. Вот!
...
Рейтинг: 0 / 0
Как именно происходит блокировка (lock)?
    #38765148
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42где этот thisLock объясняется - сейчас почитаю...
Ну разобрались? Что обьект блокировки нужен только для создания идентификатора, присвоения "имени"....
Почитайте еще про мьютексы - это в принципе, то же самое, только глобальнее.
:-)
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как именно происходит блокировка (lock)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]