Deutsch

ИИ для программиста?

82171   51 52 53 54 55 56 57 58 59 60 61 все
7495 коренной житель07.02.25 07:02
7495
NEW 07.02.25 07:02 
в ответ alex445 06.02.25 20:28
А может он наврал?

Вообще, зачем вы завели два аккаунта и сами с собой общаетесь?


"сишарпник alex445" и "блокчейнер 7495" - одно лицо? Сам себе врёт? зло


Интересная теория, а есть ли какие либо этому факты или доказательства?


Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.
Отпускник постоялец07.02.25 16:23
NEW 07.02.25 16:23 
в ответ 7495 07.02.25 07:02

ЧатГПТ упорно мне доказывает, что в обработка в этом коде может быть не thread safe

по мне так бред


protected static ConcurrentDictionary<int, object> LockerDictionary = new();

public void Process(int key)
{
var locker = LockerDictionary.GetOrAdd(key, new object());


lock (locker)
{
OperateWithKey(key)
}
}

AlexNek патриот07.02.25 17:24
AlexNek
NEW 07.02.25 17:24 
в ответ 7495 07.02.25 07:00
А как они должны ограничивать? Если бесплатников ограничивать по IP и говорить им об ЭТОМ, они поменяют себе IP.

они ограничивают как и все остальные по количеству токенов на зарегистрированного пользователя, только все остальные об этом говорят.


там надо регистрироваться

А что в чатГпт не надо?

Кстати, ваших проблем не замечал, некоторые замедления могут быть, но их почти незаметно


бесплатникам вовсе отрубают доступ

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

Ну так и фиг с ним, переходим на какой-то другой сайт.

AlexNek патриот07.02.25 17:30
AlexNek
NEW 07.02.25 17:30 
в ответ Отпускник 07.02.25 16:23, Последний раз изменено 07.02.25 17:32 (AlexNek)

не следует доверять только одной модели, тем более что она может "думать" о других исходных данных. Вот ревью от другой

---

Предоставленный вами код в целом является потокобезопасным, но существует тонкая проблема, которая может потенциально привести к неприятностям. Давайте проанализируем его:

protected static ConcurrentDictionary<!--filtered--> LockerDictionary = new();

public void Process(int key)
{
    var locker = LockerDictionary.GetOrAdd(key, new object());

    lock (locker)
    {
        OperateWithKey(key);
    }
}

Основная проблема здесь связана с методом `GetOrAdd`. Хотя `ConcurrentDictionary` является потокобезопасным, способ использования `GetOrAdd` в данном случае может привести к тонкой гонке:

1. Проблема потокобезопасности:

Объект `new object()` создается вне метода `GetOrAdd`. Это означает, что если несколько потоков вызывают `Process` с одним и тем же `key` одновременно, могут быть созданы несколько экземпляров `object`, даже если только один из них будет добавлен в словарь.

2. Потенциальная утечка памяти:

Неиспользуемые экземпляры `object`, созданные в условиях гонки, будут доступны для сборки мусора, но они все равно представляют собой ненужное создание объектов.

3. Гранулярность блокировки:

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

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

protected static ConcurrentDictionary<!--filtered--> LockerDictionary = new();

public void Process(int key)
{
    var locker = LockerDictionary.GetOrAdd(key, new object());

    lock (locker)
    {
        OperateWithKey(key);
    }
}

Используя лямбда-выражение `_ => new object()`, мы гарантируем, что новый `object` создается только при необходимости, избегая гонки и потенциальной неэффективности использования памяти.

Это изменение делает код потокобезопасным и более эффективным, сохраняя при этом преимущества мелкозернистой блокировки.

alex445 патриот07.02.25 19:07
NEW 07.02.25 19:07 
в ответ AlexNek 07.02.25 17:30

3. Гранулярность блокировки:

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

А если у нас случай мерцательной псевдослучайной микрозернистой слабосвязной блокировки, тогда как лучше? Гранулированием тут уже не обойдёшься, тут квантование нужно, причём по временнЫм квадрантам в поле всех возможных квантилей с переменным шагом. У вас какой опыт написания потокобезопасного квадрантоквантованного кода для мерцательных слабосвязных блокировок?

Лениво местный житель07.02.25 19:07
NEW 07.02.25 19:07 
в ответ AlexNek 07.02.25 17:24, Последний раз изменено 07.02.25 21:47 (Лениво)

На Оперу привешен бесплатный клиент Aria. ПоПравда он отказывается признаваться на какой модели он работает.

Ему нельзя отправить файл, но в режиме чата он работает.

Мою задачу, которую решил ДипСик, он решил иначе.

Кстати. Клиент никак не определится со своей половой принадлежностью. О себе пишет то "делал" то "делала".


Вот решение задачи, которую я тут публиковал.

По крайней мере регексп составлен иначе.


#!/bin/bash

# Имя лог-файла
LOG_FILE="your_log_file.txt"

# Переменная для хранения сообщения об ошибке
error_message=""

# Цикл по строкам лог-файла
while read -r line; do
# Проверяем, соответствует ли строка паттерну
if [[ "$line" =~ ^\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2} ]]; then
# Если это начало записи, выводим предыдущее сообщение об ошибке
if [[ -n "$error_message" ]]; then
echo "$error_message"
fi
# Очищаем переменную для новой записи
error_message=""
else
# Добавляем строку к сообщению об ошибке
error_message="$error_message$line"
fi
done < "$LOG_FILE"

# Выводим последнее сообщение об ошибке
if [[ -n "$error_message" ]]; then
echo "$error_message"
fi


Объяснение:

#!/bin/bash: Указывает интерпретатор для выполнения скрипта.
LOG_FILE="your_log_file.txt": Замените your_log_file.txt на имя вашего лог-файла.
while read -r line; do ... done < "$LOG_FILE": Цикл, который читает строки из лог-файла.
if [[ "$line" =~ ^\d{2}\.\d{2}\.\d{4} \d{2}:\d{2}:\d{2} ]]; then ... fi: Проверяет, соответствует ли строка вашему паттерну.
if [[ -n "$error_message" ]]; then ... fi: Проверяет, не пуста ли переменная error_message, и выводит ее, если нет.
error_message="$error_message$line": Добавляет строку к переменной error_message.


Как использовать:

Сохраните код в файл, например, extract_errors.sh.
Сделайте файл исполняемым: chmod +x extract_errors.sh.
Запустите скрипт: ./extract_errors.sh.
Что дальше?

Вы можете добавить обработку ошибок, например, если файл не найден.
Можно добавить вывод информации в файл или другую структуру данных.
Можно добавить анализ содержимого ошибок, например, подсчет количества ошибок каждого типа.

Гори, гори ясно!
AlexNek патриот07.02.25 19:23
AlexNek
NEW 07.02.25 19:23 
в ответ alex445 07.02.25 19:07
cлучай мерцательной псевдослучайной микрозернистой слабосвязной блокировки, тогда как лучше?

на англицком звучит гораздо лучше, но заломало перевод править.

"Lock granularity: While not strictly a thread-safety issue, using a separate lock object for each key provides fine-grained locking, which is good for performance if `OperateWithKey` is a long-running operation."

AlexNek патриот07.02.25 19:29
AlexNek
NEW 07.02.25 19:29 
в ответ Лениво 07.02.25 19:07
Правда он отказывается признаваться, на какой модели он работает.

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

Не следует полагаться на результаты только одной модели. И всегда можно узнать у третьей что лучше.

Отпускник постоялец07.02.25 23:13
NEW 07.02.25 23:13 
в ответ AlexNek 07.02.25 17:30
1. Проблема потокобезопасности:
Объект `new object()` создается вне метода `GetOrAdd`. Это означает, что если несколько потоков вызывают `Process` с одним и тем же `key` одновременно, могут быть созданы несколько экземпляров `object`, даже если только один из них будет добавлен в словарь.

не только в словарь будет добавлен один, но и только один вернет функция getOrAdd.
Так что никакой проблемы потокобезопасности нет.

Что создаются лишние объекты, я согласен. Но это мелочь.

AlexNek патриот07.02.25 23:37
AlexNek
NEW 07.02.25 23:37 
в ответ Отпускник 07.02.25 23:13
Но это мелочь.

В этот раз без перевода

This code has a subtle thread safety issue. While using ConcurrentDictionary is a good start, there's a problem with how the lock object is created.

The new object() is evaluated before GetOrAdd is called, not as a factory method. This means that if two threads try to add the same key simultaneously, they could create two different lock objects. Even though ConcurrentDictionary will only store one of them, the other thread might get its own unique lock object, breaking the mutual exclusion.

---

Here's what can happen when two threads (T1 and T2) try to access the same key simultaneously:

  1. T1 reads key=1, evaluates new object() → creates Object_A
  2. T2 reads key=1, evaluates new object() → creates Object_B
  3. T1 calls GetOrAdd(1, Object_A)
  4. T2 calls GetOrAdd(1, Object_B)

Even though ConcurrentDictionary.GetOrAdd ensures only one value is stored (let's say Object_A wins), T2 still holds Object_B in its locker variable.


// Thread 1 lock(Object_A) { ... } // Locks using object from dictionary // Thread 2 lock(Object_B) { ... } // Locks using different object!

Now both threads can enter their critical sections simultaneously because they're locking on different objects!


Отпускник постоялец08.02.25 08:52
NEW 08.02.25 08:52 
в ответ AlexNek 07.02.25 23:37
Even though ConcurrentDictionary.GetOrAdd ensures only one value is stored (let's say Object_A wins), T2 still holds Object_B in its locker variable.

Есть какое-то подтверждение из документации?
Я вчера запускал 1000 потоков и возвращался всегда один и тот же объект.

AlexNek патриот08.02.25 11:45
AlexNek
NEW 08.02.25 11:45 
в ответ Отпускник 08.02.25 08:52

вы просто не там ищите, вот еще помучал ИИ, мд формат в приложении

Вот как должно быть неправильно

Thread 4 is operating on key 1

Thread 5 is operating on key 1

Thread 6 is operating on key 1

Thread 4 finished operating on key 1

Thread 5 finished operating on key 1

Thread 6 finished operating on key 1

Thread 7 is operating on key 1

Thread 8 is operating on key 1

Thread 7 finished operating on key 1

Thread 8 finished operating on key 1

--- и правильно

Thread 4 is operating on key 1

Thread 4 finished operating on key 1

Thread 5 is operating on key 1

Thread 5 finished operating on key 1

Thread 6 is operating on key 1

Thread 6 finished operating on key 1

Thread 7 is operating on key 1

Thread 7 finished operating on key 1

Thread 8 is operating on key 1

Thread 8 finished operating on key 1

alex445 патриот08.02.25 13:30
NEW 08.02.25 13:30 
в ответ Отпускник 08.02.25 08:52, Последний раз изменено 08.02.25 13:33 (alex445)
Есть какое-то подтверждение из документации?

Зачем? ИИ моделям принято верить на слово. Говорит заумно - значит верно. На всякий случай проверим через другие ИИ модели - если гвоздь не забился одним микроскопом, будем использовать 2, 5, 10, пока не забьём.


С другой стороны, если каждый раз нужно подтверждение из документации, то смысл использовать ИИ, если каждый раз его надо проверять?

Отпускник постоялец08.02.25 13:32
08.02.25 13:32 
в ответ AlexNek 08.02.25 11:45

интересно. Надо в ПН попробовать.


alex445 патриот08.02.25 13:37
NEW 08.02.25 13:37 
в ответ AlexNek 07.02.25 23:37
Но это мелочь.

В этот раз без перевода

This code has a subtle thread safety issue. While using ConcurrentDictionary is a good start, there's a problem with how the lock object is created.

The new object() is evaluated before GetOrAdd is called, not as a factory method. This means that if two threads try to add the same key simultaneously, they could create two different lock objects. Even though ConcurrentDictionary will only store one of them, the other thread might get its own unique lock object, breaking the mutual exclusion.

---

Here's what can happen when two threads (T1 and T2) try to access the same key simultaneously:

  1. T1 reads key=1, evaluates new object() → creates Object_A
  2. T2 reads key=1, evaluates new object() → creates Object_B
  3. T1 calls GetOrAdd(1, Object_A)
  4. T2 calls GetOrAdd(1, Object_B)

Even though ConcurrentDictionary.GetOrAdd ensures only one value is stored (let's say Object_A wins), T2 still holds Object_B in its locker variable.

Через какое время чтения всех этих простыней от ИИ вы забьёте на его проверку и станете верить ему на слово и просто копипастить к себе в код? Особенно, если вы плохо разбираетесь в многопоточности и тонкостях работы конкретных потокобезопасных имплементаций.

alex445 патриот08.02.25 13:46
NEW 08.02.25 13:46 
в ответ alex445 08.02.25 13:37

Кстати, а насколько детерминированы ответы этих ИИ моделей? Два разных человека, задавших один и тот же вопрос, получат 100% один и тот же ответ?

AlexNek патриот08.02.25 13:50
AlexNek
NEW 08.02.25 13:50 
в ответ alex445 08.02.25 13:37
вы забьёте на его проверку и станете верить ему на слово

Постоянно какие-то странные выводы смущ

AlexNek патриот08.02.25 13:57
AlexNek
NEW 08.02.25 13:57 
в ответ alex445 08.02.25 13:46
Два разных человека, задавших один и тот же вопрос, получат 100% один и тот же ответ?

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

попробуйте, ответы есть. Вопрос был - будет ли это код потокобезопасным /код/

alex445 патриот08.02.25 14:07
NEW 08.02.25 14:07 
в ответ AlexNek 08.02.25 13:50, Последний раз изменено 08.02.25 14:08 (alex445)

Выводы тут пока такие. На ИИ потрачены огромные прорвы денег. Положительного результата почти нет. Зато за даже небольшое время с помощью ИИ успели загадить весь интернет. Будет прикольно, если окажется, что для чего-то стоящего ИИ так и не получится применить, а как засератель и создатель мегатонн дерьмового контента - так и останется.


В своё время учёных-ядерщиков предлагали линчевать, т.к. они создали страшное атомное оружие. Но у их исследований нашлись и полезные применения, и много. Сейчас же ИИ используется почти полностью для бесполезных и вредных вещей, т.к. для полезных он малопригоден. Если всё так и останется, то кем в историю войдут все эти альтманы, на которых вылили сравнимые с ядерщиками сотни миллиардов, а в ответ получили сверхдорогой генератор в основном дерьма?

7495 коренной житель08.02.25 14:09
7495
NEW 08.02.25 14:09 
в ответ alex445 08.02.25 13:46
Кстати, а насколько детерминированы ответы этих ИИ моделей? Два разных человека, задавших один и тот же вопрос, получат 100% один и тот же ответ?


Зачем два человека, иной раз переспросишь - ИИ исправляет свой ответ, извиняется, может засунуть кусок из другой библиотеки! зло

Вопросы и Ответы - Программируем калькулятор пособий для беженцев вместе.