Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Как правильно поступить для потокобезопасности

17.02.2024, 07:19. Показов 3769. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

Есть код, обрабатывающий побайтно файл, заранее загруженный в byte[]. Потоки организуются средствами C# через Parallel.ForEach вот таким образом:
C#
1
2
3
4
5
6
7
8
9
Parallel.ForEach(num, ii =>
{
    // много всего тут исполняется
 
    if (max < (end - start))
    {
        Interlocked.Exchange(ref max, end - start);
    }
});
Вопрос 1 - как я понимаю может возникнуть ситуация когда условие if выполнится, в другом потоке max изменится и когда будет исполняться Exchange, то оно по сути испортит данные? Логичнее ли сделать через lock весь if?

Вопрос 2 - как правильно покидать Parallel.ForEach внутри кода, если там не получается использовать break? Я сейчас просто делаю метку к концу и прыгаю туда goto.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2024, 07:19
Ответы с готовыми решениями:

Как правильно поступить?
Если я пишу код в обработчике события, в котором происходит инициация следующего обработчика события, то эта цепочка может выполнятся...

Как правильно поступить
Есть два запроса. За пример возьму: russian photography russian photographer Протупил и заказал текст под эти два запроса....

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

62
Эксперт .NET
 Аватар для Rius
13391 / 7842 / 1699
Регистрация: 25.05.2015
Сообщений: 23,853
Записей в блоге: 14
19.02.2024, 09:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от belalugoci Посмотреть сообщение
C#
1
object balanceLock = new object();
- поле инициализируется где-то один раз, в конструкторе.

А затем много раз используется:
Цитата Сообщение от belalugoci Посмотреть сообщение
C#
1
lock (balanceLock) { ... }
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.02.2024, 09:57  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
А затем много раз используется
вы же прочитали текст курсивом?
0
Эксперт .NET
 Аватар для Rius
13391 / 7842 / 1699
Регистрация: 25.05.2015
Сообщений: 23,853
Записей в блоге: 14
19.02.2024, 10:01
Не хотите слушать -, как сказал Usaga, - пишите как умеете.
А то, что у вас потом не работает, это следствие того, что вы пишите как умеете, а не как правильно.
Мне вас уже лень переубеждать. У вас не работает? Это ваши проблемы, не мои.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.02.2024, 10:18  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
А то, что у вас потом не работает, это следствие того, что вы пишите как умеете, а не как правильно.
эта тема совсем не об этом. я адекватный вопрос задал в самом начале, потом сделал так как указано в MSDN. Если вы считаете что в MSDN ошибка или я неправильно трактую написанное, то вы можете про это написать, а не заниматься язвительным поучительством.
0
Эксперт .NET
 Аватар для Rius
13391 / 7842 / 1699
Регистрация: 25.05.2015
Сообщений: 23,853
Записей в блоге: 14
19.02.2024, 10:25
Вы неправильно понимаете написанное в msdn. Очевидно же, не?

Для одного ресурса один объект блокировки.
Не для каждой попытки блокировки, что чуть более чем бессмысленно, а для одного ресурса.
3
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
19.02.2024, 10:41

Не по теме:

Цитата Сообщение от belalugoci Посмотреть сообщение
хочу напомнить что мы находимся в разделе для новичков
И? запрещено говорить что написана чушь? Или нужно как с пятилетним: ути-пуси, молодец! иди покажи маме!



Я вначале решил что на MSDN действительно как-то невнятно написано, но нет: кто-то читает по диагонали. Рекомендации
При синхронизации доступа потоков к общему ресурсу блокируйте выделенный экземпляр объекта (например, private readonly object balanceLock = new object();) или другой экземпляр, который, скорее всего, не будет использоваться как объект блокировки другими частями кода. Не используйте один и тот же экземпляр объекта блокировки для разных общих ресурсов: это может привести к взаимоблокировке или состязанию при блокировке. В частности, не используйте следующие экземпляры в качестве объектов блокировки:
  • this, так как он может использоваться вызывающими объектами как блокировка;
  • Type экземпляры, так как они могут быть получены оператором typeof или отражением.
  • экземпляры строк, включая строковые литералы, так как они могут быть интернированы.
Удерживайте блокировку в течение максимально короткого времени, чтобы сократить число конфликтов при блокировке.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.02.2024, 12:20  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
И? запрещено говорить что написана чушь?
не запрещено, но не имеет смысла это писать в качестве аргумента. так как было бы странно чтобы тут вопросы задавали гении.

Цитата Сообщение от Rius Посмотреть сообщение
Для одного ресурса один объект блокировки.
Не для каждой попытки блокировки, что чуть более чем бессмысленно, а для одного ресурса.
ну их фразы это не очевидно, так как "для разных общих ресурсов" можно понять двояко.
в целом не ясно зачем для lock сделали указание объекта если это формальность, но это вне рамок обсуждения и мне не слишком интересно.

Цитата Сообщение от Wolfdp Посмотреть сообщение
кто-то читает по диагонали
Когда есть два смысла, то я могу понять это так, как возможно авторы не закладывали (или как вы подумали), а так как у меня слабый контекстный бэкграунд, то я точно буду понимать не так как вы.

Далее, вынес object lockObject = new object(); за рамки лмбда-функции, но ему такое не нравится.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.02.2024, 18:46  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
object sync = new object();
Parallel.ForEach(i, ii =>
{
    lock (sync)
    {
        if (max < (end - start))
        {
            max = end - start;
        }
    }
});
как ни странно, но на другом ПК он перестал ругаться на вынесенный object за ForEach.
В любом случае по скорости полный провал, в 4.5 раза медленнее чем последовательный код, но потребление ОЗУ 137 мегабайт, непонятно зачем столько ОЗУ.
Ладно, для меня тема исчерпана.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
19.02.2024, 19:09
Цитата Сообщение от belalugoci Посмотреть сообщение
В любом случае по скорости полный провал, в 4.5 раза медленнее чем последовательный код,
Ну ещё бы. Блокировка Всех операций при этой операции в любой "параллеле".
Надеюсь теперь поймёте что ThreadLocal как раз тут и нужен.

Ах да... я забыл - "это не поиск максимального значения". Мы пытаемся сделать что-то о чём не знаем. Но упорно пытаемся что-то советовать, насаждая своё понимание нормального программирования.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
19.02.2024, 20:28  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
Блокировка Всех операций
как я понял блокировка не всех операций, а только последовательное исполнение этого if.

Цитата Сообщение от HF Посмотреть сообщение
Надеюсь теперь поймёте что ThreadLocal как раз тут и нужен.
я правильно понимаю что все max я должен сложить в некий массив (список), после окончания всех потоков пройтись по всем спискам с повторным поиском среди max действительного значения? Если это так, то это довольно приличный объем данных.
Из примера я правда не понял как им пользоваться и как отдавать данные из лямбды в основную программу.

Цитата Сообщение от HF Посмотреть сообщение
"это не поиск максимального значения"
вы увидели то, что я вам показал, вопрос связан с изоляцией if, а не с самим кодом. Если у вас стояк на слово max, могу написать
C#
1
2
3
4
5
6
7
8
9
10
11
object sync = new object();
Parallel.ForEach(i, ii =>
{
    lock (sync)
    {
        if (a < (e - s))
        {
            a = e - s;
        }
    }
});
чего вполне достаточно для вопроса про lock.

Цитата Сообщение от HF Посмотреть сообщение
Мы пытаемся сделать что-то о чём не знаем
Не нужно пытаться, достаточно отвечать на вопрос, если конечно вам есть что сказать. Ну и форум - добровольный, можете вообще ничего не читать и никому не отвечать.

Цитата Сообщение от HF Посмотреть сообщение
Но упорно пытаемся что-то советовать, насаждая своё понимание нормального программирования
Вместо ответа про lock вы пытаетесь прикрутить какое-то решение к выдуманному if агрясь на слово max и считая, что вы познали дзен.

Задавая вопрос - я хочу получить ответ, а не лекцию о правильном программировании чего-то придуманного вами или нотацию на тему моего нежелания "становиться лучшим в мире программистом". Учите своих жён и детей, а я сам как-то разберусь - учиться мне или нет.
0
HF
 Аватар для HF
1337 / 921 / 202
Регистрация: 09.09.2011
Сообщений: 2,742
Записей в блоге: 2
20.02.2024, 00:59
Цитата Сообщение от belalugoci Посмотреть сообщение
как я понял блокировка не всех операций, а только последовательное исполнение этого if.
Разумеется то что внутри lock, то и блокируется. Но раз там сравнения, то и все форы. которые будут этим же заниматься - будут заблокированы постоянно. Щас точная формулировка? Это объяснило дедлоки и падение скорости в 4.5 раза?

Цитата Сообщение от belalugoci Посмотреть сообщение
Если у вас стояк на слово max, могу написать
Если вы смысла не понимаете, то не у меня стояк на слово "max", а у вас висяк на смысл кода. Переменная max, которая и по названию и по виду определяет максимальное значение... не может быть ничем кроме "максимального значения" в каких-то данных.

Цитата Сообщение от belalugoci Посмотреть сообщение
Не нужно пытаться, достаточно отвечать на вопрос, если конечно вам есть что сказать. Ну и форум - добровольный, можете вообще ничего не читать и никому не отвечать.
Не нужно пытаться, достаточно читать что советуют, делать и писать что это работает/не работает/не совсем то что нужно.
Тут согласен. Форум добровольный, хочу читаю, хочу пишу. А вы в свою очередь, можете вообще ничего не писать.

Цитата Сообщение от belalugoci Посмотреть сообщение
Задавая вопрос - я хочу получить ответ, а не лекцию о правильном программировании чего-то придуманного вами или нотацию на тему моего нежелания "становиться лучшим в мире программистом". Учите своих жён и детей, а я сам как-то разберусь - учиться мне или нет.
В больницу так же ходите? "Не учите меня что мне есть и пить. Своих родных учите. А мне только скажите что у меня болит, а я сам как-то разберусь".
4
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
20.02.2024, 08:17  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
будут заблокированы постоянно
не постоянно, а на этом if

Цитата Сообщение от HF Посмотреть сообщение
Переменная max, которая и по названию и по виду определяет максимальное значение... не может быть ничем кроме "максимального значения" в каких-то данных
это код который я придумал чтобы был пример в вопросе, поэтому говорю еще раз - вы пытаетесь обсуждать собственные фантазии не имеющие ко мне никакого отношения.

Цитата Сообщение от HF Посмотреть сообщение
достаточно читать что советуют
80% написанного к "советам" вообще не относится. Всё что писали по теме, кроме ThreadLocal, который я вообще не понимаю как мне поможет, я попробовал ДО создания этой темы. И так как были вопросы, то тему и создал.

Цитата Сообщение от HF Посмотреть сообщение
В больницу так же ходите?
Почти так. За полтора года прошёл 12 врачей (трое платных) и только один подтвердил то, что я САМ нарыл в интернете. Все остальные в принципе ничего сказать не могли, больше всего отличился терапевт участковый, которая сфинктер Одди пульпировала у меня в солнечном сплетении. Идиотов хватает везде. Так что пример очень в тему.

Итак, возвращаясь к вопросу:
как я понимаю может возникнуть ситуация когда условие if выполнится, в другом потоке max изменится и когда будет исполняться Exchange, то оно по сути испортит данные? Логичнее ли сделать через lock весь if?
Ответ №1
Цитата Сообщение от IamRain Посмотреть сообщение
Используйте ThreadLocal, а после завершения цикла Parallel.Foreach ищите максимум среди всех ThreadLocal.
Ответ №2
Цитата Сообщение от HF Посмотреть сообщение
лочить весь блок IF
Ответов два, а сообщений 31 (из них половина вообще к теме не относится), вам не кажется что у кого-то словесный понос?

ThreadLocal не подойдёт, так как это породит необходимость повторного поиска, который тоже нужно будет распараллеливать, что опять породит ThreadLocal и т.д.

Lock сильно тормозит работу кода и жрёт оперативку как не в себя.

Попробую разобраться с реализацией через CompareExchange, так как Exchange работает хорошо, но if остаётся в подвешенном состоянии.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
25.02.2024, 07:14  [ТС]
Такой вопрос - можно ли потокам иметь уникальный номер не связанный с другим потоком, но чтобы он оставался фиксированным на протяжении всего хода выполнения?
Потоки привязаны к ядрам и было бы логично имея номер потока 1 после его окончания работы снова запустить другой поток тоже с номером 1, не пересекаясь. Тогда можно было бы результаты записывать в массив размерности числа ядер а окончательную проверку делать после закрытия всех потоков, даже для 128 ядер это всего 128 элементов массива.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
25.02.2024, 09:13
Цитата Сообщение от belalugoci Посмотреть сообщение
Lock ... жрёт оперативку как не в себя.
lock не может жрать оперативку...
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.02.2024, 10:21
Цитата Сообщение от HF Посмотреть сообщение
Надеюсь теперь поймёте что ThreadLocal как раз тут и нужен
Я бы все-таки дождался озвучивания полной задачи. ThreadLocal -- "инкапсулирует" значение внутри потока, а я так понимаю нам таки нужно что-то разбить на несколько вычислительных потоков, и получить в финале результат. Можно конечно и через ThreadLocal, но кажись не с Parallel.ForEach.

belalugoci,
Самое частое решение: дробим все данные на блоки/батчи/группы/подмассивы, и скармливаем эти части отдельным потокам. Результат агрегируем и по заверешнию всех вычислений -- выводим результат из короткого массива. Прирост от многопоточности будет начиная с 1кк значений (и то не факт). Меньше запихивать в многопоток нет смысла.

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

Опишите входной массив и что с ним нужно сделать. Можно словами, код потом подскажут.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
25.02.2024, 10:33  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
lock не может жрать оперативку...
значит сам parallel.foreach, легче от этого не становится.

Добавлено через 5 минут
Цитата Сообщение от Wolfdp Посмотреть сообщение
я так понимаю нам таки нужно что-то разбить на несколько вычислительных потоков, и получить в финале результат
а есть другие варианты понимания задачи?

Цитата Сообщение от Wolfdp Посмотреть сообщение
дробим все данные на блоки/батчи/группы/подмассивы, и скармливаем эти части отдельным потокам
я об этом и написал в последнем комментарии

Цитата Сообщение от Wolfdp Посмотреть сообщение
Пока вы будете озвучивать код и задачу кусками
я озвучил вполне исчерпывающее описание, если что-то непонятно - спрашивайте.

Цитата Сообщение от Wolfdp Посмотреть сообщение
Опишите входной массив и что с ним нужно сделать. Можно словами, код потом подскажут
например - английский текст, найти самое длинное слово.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.02.2024, 12:04
Цитата Сообщение от belalugoci Посмотреть сообщение
например - английский текст, найти самое длинное слово.
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
int batch = 5;
string source = "123 1234 12345678 1234";
var tasks = new List<Task<string>>();
for (var i = 0; i < source.Length; i += batch)
{
    var start = i; //!!!!!
    tasks.Add(Task.Run(() => Max(start)));
}
 
var result = tasks.Select(t => t.Result).OrderByDescending(x => x.Length).First();
Console.WriteLine(result);
 
string Max(int start)
{
    var n = start + batch;
    var max = string.Empty;
    var builder = new StringBuilder();
    char ch;
    for (var i = start; i < n; i++)
    {
        while(i < source.Length && (ch = source[i]) != ' ')
            builder.Append(source[i++]);
        if (max.Length < builder.Length)
            max = builder.ToString();
        builder.Clear();
    }
 
    return max;
}
P.S. если текст грузится из файла -- все єто до одного места. Все равно упретесь в I/O, даже если это будет SSD на 6Гб/с.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
25.02.2024, 15:03  [ТС]
Wolfdp, очень медленно и будет кушать оперативку, идею я понял без примера, возможно смогу прикрутить к своему коду, спасибо. Во всяком случае Parallel.ForEach тут точно не подходит.
Не ясно только зачем ему столько ОЗУ, еще бы это компенсировалось скоростью - можно было бы понять.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
| Method        | Length | Mean           | Allocated    | Alloc Ratio  |
|-------------- |------- |---------------:|-------------:|-------------:|
| Single        | 1      |       222.3 us |         64 B |         1.00 |
| Parallel      | 1      |       116.8 us |     135671 B |     2,119.86 |
| Wolfdp        | 1      |       664.5 us |    1001371 B |    15,646.42 |
|               |        |                |              |              |
| Single        | 100    |    23,659.6 us |         76 B |         1.00 |
| Parallel      | 100    |    17,113.7 us |    8393449 B |   110,440.12 |
| Wolfdp        | 100    |   184,912.9 us |  101092608 B | 1,330,165.89 |
|               |        |                |              |              |
| Single        | 1000   |   239,193.5 us |        197 B |         1.00 |
| Parallel      | 1000   |   178,039.6 us |  134222920 B |   681,334.62 |
| Wolfdp        | 1000   | 1,878,787.6 us | 1002212416 B | 5,087,372.67 |
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
25.02.2024, 21:22
Цитата Сообщение от belalugoci Посмотреть сообщение
очень медленно и будет кушать оперативку, ....
Ужас как не хотел вмешиваться, но ...

Что за код вы тестируете?
Если вот этот:
Цитата Сообщение от belalugoci Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
object sync = new object();
Parallel.ForEach(i, ii =>
{
    lock (sync)
    {
        if (a < (e - s))
        {
            a = e - s;
        }
    }
});
То это бессмыслица. И выдаёт бессмысленный результат.
Вернее выдаёт результат, что lock - это не бесплатная операция, что и так очевидно.

Если вот этот:
Цитата Сообщение от belalugoci Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
Parallel.ForEach(num, ii =>
{
    // много всего тут исполняется
if (max < (end - start))
    {
        Interlocked.Exchange(ref max, end - start);
    }
});
То общий результат зависим от соотношения длительности // много всего тут исполняется, трат на создание запуск отдельных задач, и трат на локировку для аккумуляцию результата.
Так как у нас нет понимания что за код // много всего тут исполняется, то для нас результат вашего теста тоже полная бесмыслица.

А если взять задачу в целом:
Цитата Сообщение от belalugoci Посмотреть сообщение
Есть код, обрабатывающий побайтно файл
То здесь ещё нужна оценка длительности скачки файла, так как обычно это самая медленная часть исполнения.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
25.02.2024, 22:28
belalugoci, на какой длине строки вы проверяли?

Добавлено через 5 минут
А, ещё такой момент -- batch задавили часом не тоже по 5? Выше забыл упомянуть, но нужно чтобы одна группа была большой, т.к. создание/старт каждой группы отъедает время.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2024, 22:28

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

как правильно поступить с COOKIE
Привет всем делаю рефиральную систему. Хочу сделать что бы добавив к любому адресу сайта get параметр в куки записывался id реферала. у...

как правильно поступить с hover
Привет всем. сейчас делаю меню и у меня возник вопросик. у меня вертикальное выпадающее меню на чистом css. Так вот у каждого пункта есть...

Отображение левого меню, как правильно поступить?
На сайте есть левое меню и есть контент. В данный момент подменю выпадающее. Надо сделать так, чтобы оно было справа от основного меню....

Как правильно нужно поступить в текущей ситуации?
Добрый день. Есть задача сделать &quot;журнал&quot; в excel с группами который выглядел бы как на диаграмме 1. Соответственно я захотел хоть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru