Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538

Асинхронность и Семафор

03.04.2021, 20:27. Показов 5650. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здесь как-то затронули тему...
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
// Семафор надо блокировать в функции потока - в async, а не снаружи
// sem_wait блокирует семафор, sem_post - разблокирует. В таком порядке они и должны вызываться.
// Кроме того, эта пара функций должна вызываться в одном потоке.
логика:
If the value is 0, then we will wait till somebody has done sem_post
корректный код c async в пуле потоков (задаётся здесь вектором), наверно, выглядит так
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
#include <iostream>
#include <semaphore.h>
#include <future>
#include <thread>
#include <vector>
#include <Windows.h>
 
using namespace std;
 
int main(int argc, const char *argv[])
{
    std::vector<std::future<void>> futures;
    sem_t semaphore1;
    
    sem_init(&semaphore1, 0, 1);    // 1 - бинарный семафор (can have 0 or 1)
    for (int i = 0; i < 10; ++i) { 
        futures.push_back(std::async(launch::async, [&semaphore1, i]
        {   
            Sleep(1000);       
            
            sem_wait(&semaphore1);  // decrements the semaphore, if 0 - then blocking sem.
            Sleep(100);
         
            cout <<"Hello world " << i << endl; 
              
            sem_post(&semaphore1);          // increments the semaphore that is being waited => smbd becomes awakened
        }));  
 
    }    
 
    for (auto &fut : futures) {
        fut.get();
        
    }
    
    sem_destroy(&semaphore1);
    return 0;
}
корректно ли так писать?
что-то из источников складывается ощущение - что у каждого потока должен быть свой семафор?... в отличие от condition variable... верно ли моё ощущение?.. и тогда код, предоставленный, может не совсем корректен?

Добавлено через 41 минуту
p.s.
сделаю оговорку:

хоть бинарный семафор и мьютекс часто используют для одинаковой цели - для синхронизации, но механизм работы у них разный: мьютекс блокирует, семафор сигнализирует... поэтому 1й используется для доступа к разделяемым переменным, а второй в отношениях producer-consumer (writer-reader) между потоками...
в данном случае - разделяемый доступ к std::cout...
- может, правильнее делать 2 семафора (для writer и для reader) - как здесь... механизм вкратце здесь
важно:
операция «проверка и уменьшение» должна быть атомарной по отношению к другим потокам
p.p.s
в c++11 semaphore не вошёл, как и в boost, потому что разработчики предпочли mutex и condition_variable. поскольку работа семафора нестабильна... (пишу, как помню, - источник не найду сейчас)... наверно, по стандартной причине для сигнализирующих инструментов - spurious_wakeups:
Возврат из функции sem_wait может произойти преждевременно, если будет получен сигнал. При этом возвращается ошибка с кодом EINTR.
Разница между sem_wait и sem_trywait заключается в том, что последняя не приостанавливает выполнение процесса, если значение семафора равно нулю, а просто немедленно возвращает ошибку EAGAIN.
но всё-таки, раз condition_variables работают только с win7, а semaphore и на более ранних версиях win - думаю, стоит знать и этот инструмент сигнализации между потоками...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2021, 20:27
Ответы с готовыми решениями:

Семафор
Условия задания. Есть 10 компьютеров в лаборатории и постоянный поток студентов. Каждый студент хочет использовать компьютер в течение...

Семафор в ОС
Зачем нужно максимальное и начальное значения в создании семафора hSemaphore = CreateSemaphore( NULL, 1, 1, NULL ); Нужен пример где в ОС...

Семафор
самый распространенный конструктор класса Semaphore это : public Semaphore(int initialCount, int maximumCount) где initialCount...

34
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 20:41
Цитата Сообщение от JeyCi Посмотреть сообщение
что-то из источников складывается ощущение - что у каждого потока должен быть свой семафор?... в отличие от condition variable... верно ли моё ощущение?..
Нет, не верное. С чего у тебя сложилось это ощущение?

Добавлено через 4 минуты
Цитата Сообщение от JeyCi Посмотреть сообщение
хоть бинарный семафор и мьютекс часто используют для одинаковой цели - для синхронизации, но механизм работы у них разный: мьютекс блокирует, семафор сигнализирует...
Не, примерно одинаковый. Семафор со счётчиком равным единице это то же самое, что мьютекс.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
03.04.2021, 20:44  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
С чего у тебя сложилось это ощущение
там 2 семафора на такую задачу (последний код):
Рассмотрим следующий пример. Есть три потока. Все три создаются одновременно, но второй должен работать только после того, как отработает первый, а третий после того, как отработает второй.
так правильно ли я код набросала?.. можно ли так?... ( чтобы исправить недоработки из прошлой темы)...
или всё-таки в случае, который я кодом приложила, надо 2 семафора (как линк из-под спойлера) - т.е. 1 семафор на mainThread (где cout) и один семафор на остальные (которые ожидают, пока можно написать в cout) ? - натолкнули размышления про writer-reader по линку под спойлером
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 21:08
Цитата Сообщение от JeyCi Посмотреть сообщение
ли всё-таки в случае, который я кодом приложила, надо 2 семафора (как линк из-под спойлера) - т.е. 1 семафор на mainThread (где cout) и один семафор на остальные (которые ожидают, пока можно написать в cout) ? - натолкнули размышления про writer-reader по линку под спойлером
Там не writer-reader, а просто два потока по очереди обращаются к переменной. То же самое можно и с мьютексами сделать (хотя, там говорится, что мьютекс нужно блокировать/разблокировать в одном потоке, иначе UB. Но обычно всё нормально.).

Добавлено через 6 минут
Семафоры вроде нужны для других задач - для ограничение количества обращений к ресурсу. Например, если у тебя в очереди накопилось, допустим, 100 элементов, то семафор заблокирует потоки, которые добавляют элементы, и очередь не переполнится (хотя, я у себя никогда не использовал семафоры, поэтому могу соврать)
1
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
03.04.2021, 21:20  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Семафоры вроде нужны для других задач - для ограничение количества обращений к ресурсу. Например, если у тебя в очереди накопилось, допустим, 100 элементов,
вот я и говорю, что в producer-consumer (writer-reader) relations между потоками... а как замена мьютекса - не-ахти, потому что "ложные пробуждения" могут быть...
в conition_variable для страховки от них используется буль
C++
1
    while (!b_gate_open) cv_oGate.wait(lock);
а, используя семафор, как страховаться от ложных пробуждений потока? - не понятно мне пока...
вроде есть sem_trywait - надо, наверно, как-то обрабатывать его EAGAIN возврат...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 21:33
Цитата Сообщение от JeyCi Посмотреть сообщение
а как замена мьютекса - не-ахти, потому что "ложные пробуждения" могут быть...
Что-то насчёт "ложных пробуждений" сильно сомневаюсь. Что за блокировка, которая может вдруг не с того не сего разблокироваться?
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
03.04.2021, 22:28  [ТС]
вот и говорю же семафор - это не блокировка... он просто сигнализирует (источник stackoverflow и др.)...
- может по этой причине и заявления о нестабильности его работы и невхождение его в c++11 ...
CV же ждёт на мьютексе... (вот с++11 выбрал cv и мьютекс)
вообще, скореееее всего просто кто как называет и кто как переводит в сети, - блокировка-неблокировка -- ведь суть не в этом, а в механизме срабатывания... видела на stackoverflow не одно заявление о возможности поведения типа spurious wake-ups у семафоров...
p.s.
с trywait была не права
sem_trywait и другие функции "пробной" блокировки существуют для ситуаций, когда вы не можете позволить себе ждать блокировки, и вы скорее отказываете в операции, чем ждете, пока блокировка не станет доступной. Очень немногие приложения на самом деле имеют такие требования.
перевод сетевой, не мой... я на англ.яз. своим глазам больше верю, чем google'у... к слову "блокировка" и др.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.04.2021, 22:31
Цитата Сообщение от JeyCi Посмотреть сообщение
CV же ждёт на мьютексе...
condition_variable не "ждёт на мьютексе". Она разблокирует мьютекс и останавливает поток. И вот у неё-то как раз и могут быть "ложные срабатывания" (недавно столкнулся - так и не смог понять почему condition_variable выходит из wait_for раньше времени)
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
03.04.2021, 22:39  [ТС]
кстати я не про с++20 - там семафоры вроде вернули... и бинарные и со счётчиком

Добавлено через 5 минут
да помню, уже не ждёт на мьютексе... но будет ждать пока её не notify кто-нибудь... - поэтому это тоже спорно - ждёт/не-ждёт
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
04.04.2021, 10:03  [ТС]
ещё раз - суть
// Функция sem_post() увеличивает (разблокирует) семафор, на который указывает sem.
// Если значение семафора после этого становится больше нуля,
// то другой процесс или нить заблокированная в вызове sem_wait, проснётся и заблокирует семафор.
p.s.
//signaled_state - unlock - отпускает i, работает далее асинхронно...
//Функция sem_post() безопасна для асинхронных сигналов: её можно использовать внутри обработчика сигналов.
Цитата Сообщение от JeyCi Посмотреть сообщение
с trywait
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <semaphore.h>
#include <future>
#include <vector>
#include <Windows.h>
 
using namespace std;
 
int main(int argc, const char *argv[])
{
    std::vector<std::future<void>> futures;
    sem_t semaphore1;
    
    sem_init(&semaphore1, 0, 1);
    for (int i = 0; i < 10; ++i) { 
        futures.push_back(std::async(launch::async, [&semaphore1, i]
        {   
       /*sem_trywait() is the same as sem_wait(), except that if the
       decrement cannot be immediately performed, then call returns an
       error (errno set to EAGAIN) instead of blocking.
       */
       /*
       EAGAIN The operation could not be performed without blocking (i.e., the semaphore currently has the value zero).
        */
          
        // Do something while sem_wait in C  
            for (;;) {
              if (sem_trywait(&semaphore1)) {
                 if (errno != EAGAIN) {
                     /* handle error */
                     abort();                    
                 }
                 errno = 0;              
                 //can do smth you want 
                 
              } else {
                  cout <<"continue this " << i << endl;
                 break;
              }
            }
         
            cout <<"Hello world " << i << endl; 
  
            sem_post(&semaphore1);
        }));  
 
    }    
 
    for (auto &fut : futures) {
        fut.get();
        
    }
    
    sem_destroy(&semaphore1);
    return 0;
}
- ещё раз отмечу, это не c++20, а semaphore.h, используемый в Unix (Linux) с-проектах часто ... его имела ввиду и ранее по теме
=====================
Добавлено через 1 час 32 минуты
В общем, главное Отличие мьютексов о семафоров: (всё цитаты)
1) ownership - мьютекс д. разблокировать CS в том же потоке, в котором он его заблокировал (Locking Mechanism), семафор может быть разблокирован др. потоком (Signaling Mechanism)... (On Windows, binary semaphores are more like event objects than mutexes.)

2) испоьзуя мьютекс, можно попасть в deadlock,
3) Mutex is costly operation due to protection protocols associated with it. Main aim of mutex is achieve atomic access or lock on resource.
ХОТЯ встречается и такое: Mutex is lightweight and faster than semaphore. Futex is even faster.
вопрос скорости сводится к тому, что
This ownership constraint makes it possible to provide protection against:
•Accidental release
•Recursive Deadlock
•Task Death Deadlock

These constraints are not always present because they degrade the speed. During the development of your code, you can enable these checks temporarily

4) ведь всё-таки:
Mutexes are designed to be held only for a short time; violating this can cause poor performance and unfair scheduling. For example, a running thread may be permitted to acquire a mutex, even though another thread is already blocked on it.
Whereas in case of semaphore if same process tries to acquire it again it blocks as it can be acquired only once.
5) -- Mutex works in user space.
-- The correct use of a semaphore is for signaling from one task to another. Semaphores can also be used to signal from an interrupt service routine (ISR) to a task. Signaling a semaphore is a non-blocking RTOS behavior and thus ISR safe. Because this technique eliminates the error-prone need to disable interrupts at the task level.This works in kernel space.
Officially:
"A semaphore restricts the number of simultaneous users of a shared resource up to a maximum number. Threads can request access to the resource (decrementing the semaphore), and can signal that they have finished using the resource (incrementing the semaphore)." Ref: Symbian Developer Library

6) A thread can call a wait function repeatedly on a mutex without blocking. However, if you call a wait function twice on a binary semaphore without releasing the semaphore in between, the thread will block. (aka like recursive mutex - A mutex can be locked more than once only if its a recursive mutex)
p.s.
, also there shouldn’t be any “first unlock”, rather it should be always “first lock”.

ИТОГО

A Mutex controls access to a single shared resource. It provides operations to acquire() access to that resource and release() it when done.
A Semaphore controls access to a shared pool of resources. It provides operations to Wait() until one of the resources in the pool becomes available, and Signal() when it is given back to the pool.
Thus a Semaphore is a higher level abstraction than Mutex.
A Mutex can be implemented using a Semaphore but not the other way around.
understand the inherent dangers associated with using the semaphore
//https://blog.feabhas.com/2009/09/mutex-vs-semaphores-%E2%80%93-part-1-semaphores/
These include:
◾Accidental release
◾Recursive deadlock
◾Task-Death deadlock
◾Priority inversion
◾Semaphore as a signal


Добавлено через 8 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
(недавно столкнулся - так и не смог понять почему condition_variable выходит из wait_for раньше времени)
по линку под последним спойлером, - возможно, и подобие вашего случая описано - только для семафора
Priority Inversion: ◾After some time has passed, a watchdog timer goes off, notices that the data bus task has not been executed for some time, concludes that something has gone drastically wrong, and initiate a total system reset.
Добавлено через 1 час 50 минут
p.s.
Цитата Сообщение от JeyCi Посмотреть сообщение
(Locking Mechanism), (Signaling Mechanism)...
действительно, парковка и светофор - видимо, по разному работают...

Добавлено через 25 минут
а как я только на c++17... то C (sem_init) не особо хорошо подряжать (смешивая С и С++)... да и не линукс у меня (многопоточный) и не для posix пишу, где хочешь-нехочешь, а даже кода не было condition_variable, то приходилось использовать С-шные семафоры, чтобы задействовать все ресурсы ради скорости, но и норм. IPC не забыть сделать
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
04.04.2021, 17:25  [ТС]
Цитата Сообщение от JeyCi Посмотреть сообщение
в данном случае - разделяемый доступ к std::cout...
стоит вспомнить Майерса - Skott_Meyers_Effektivnyiy_i_sovremennyiy _C++ - 42 рекомендации по использованию C++11 и C++14: => 7 .S. Применяйте фьючерсы void дnя одноразовых сообщений о событиях
и его рекомендации:
Сnедует запомнить
• Для простого сообщения о событии дизайн с применением переменных условия требует
избыточных мьютексов, накладывает ограничения на относительное выполнение
задач обнаружения и реакции и требует от задачи реакции проверки того, что
событие в действительности имело место.
• Дизайн с использованием флага устраняет эти проблемы, но использует опрос, а не
блокировку.
• Переменные условия и флаги могут быть использованы совместно, но получающийся
механизм сообщений оказывается несколько неестественным.
• Применение объектов s t d : : p romi se и фьючерсов решает указанные проблемы, но
этот подход использует динамическую память для общих состояний и ограничен
одноразовым сообщением.
... и packaged_tasks, которые позволяют бросать исключения... или их можно std::move в др. поток, если надо...
std::packaged_task
"The class template std:: packaged_task wraps any callable target (function, lambda expression, bind expression, or another function object) so that it can be invoked asynchronously. Its return value or exception thrown is stored in a shared state which can be accessed through std::future objects."

-- и чтобы не застревать в блокирующем fut.get()... или зациклить отлов этих get() - чтобы не блокировать io
p.s.
и моё напоминание в той же ветке:
Цитата Сообщение от JeyCi Посмотреть сообщение
хотя да - для IO-bound операций - многопоточность не совсем то, что надо...
а Асинхронность - как раз годится
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.04.2021, 18:40
Цитата Сообщение от JeyCi Посмотреть сообщение
... и packaged_tasks, которые позволяют бросать исключения... или их можно std::move в др. поток, если надо...
Цитата Сообщение от JeyCi Посмотреть сообщение
• Применение объектов s t d : : p romi se и фьючерсов решает указанные проблемы, но
этот подход использует динамическую память
для общих состояний и ограничен
одноразовым сообщением.
Для них всех вот этот недостаток - динамическое выделение памяти - может создасть серьёзные проблемы с производительностью. Надо об этом помнить.
1
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
04.04.2021, 20:21  [ТС]
и для просто фьючерсов?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.04.2021, 20:43
Цитата Сообщение от JeyCi Посмотреть сообщение
и для просто фьючерсов?
Ну да. Там просто время жизни объекта должно контролироваться двумя потоками, а для этого нужно что-то типа shared_ptr, т.е. динамическое выделение памяти.
1
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
04.04.2021, 21:22  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
т.е. динамическое выделение памяти.
точно! ведь вектор фьючей - динамический массив...
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
нужно что-то типа shared_ptr
ну если это добрО в контейнере, то о ptr, наверно, можно не думать... только если Lifetime удлиннить (но это просто ptr, а не ptr=new future)... т.е., вероятно, просто указывающий указатель, а не владеющий... ведь удалять будет деструктор вектора
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.04.2021, 21:25
Цитата Сообщение от JeyCi Посмотреть сообщение
точно! ведь вектор фьючей - динамический массив...
Нет. Это здесь ни при чём.
При создании собственно std::future необходимо создавать объект (внутренний) динамически. Это может сказаться при запуске задачи в пуле потоков.
1
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
04.04.2021, 21:32  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
объект (внутренний) динамически
ух, значит всё уже обёрнуто... но спасибо, что предупредили, что внутренности динамические...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
04.04.2021, 21:35
Цитата Сообщение от JeyCi Посмотреть сообщение
ух, значит всё уже обёрнуто... но спасибо, что предупредили, то внутренности динамические...
Скотт-Мейерс тебя предупреждали ровно об этом
Цитата Сообщение от JeyCi Посмотреть сообщение
• Применение объектов s t d : : p romi se и фьючерсов решает указанные проблемы, но
этот подход использует динамическую память для общих состояний и ограничен
одноразовым сообщением.
0
263 / 152 / 33
Регистрация: 29.06.2019
Сообщений: 1,538
05.04.2021, 08:53  [ТС]
я понимаю, что std::async более высокоуровневый, чем std::thread... в связи с этим - вопрос на уточнение:
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::thread, создаёшь на cтеке только если ты будешь дожидаться его завершения в этой же функции,
а std::thread внутри динамический?.. или согласно данной цитате его надо создавать через new?.. и оборачивать самостоятельно (делать wrapper чтобы t.join срабатывал в деструкторе при любом исходе - норм. или выбросе исключения)...
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
05.04.2021, 10:03
Цитата Сообщение от JeyCi Посмотреть сообщение
я понимаю, что std::async более высокоуровневый, чем std::thread... в связи с этим - вопрос на уточнение:
Нет, не более. Точно такой же.

Цитата Сообщение от JeyCi Посмотреть сообщение
а std::thread внутри динамический?.. или согласно данной цитате его надо создавать через new?..
Да, динамический. Там в конструктор передаётся объект неизвестного заранее размера. Чтобы его скопировать необходимо выделить память.

Цитата Сообщение от JeyCi Посмотреть сообщение
и оборачивать самостоятельно (делать wrapper чтобы t.join срабатывал в деструкторе при любом исходе - норм. или выбросе исключения)...
Я обычно обёрктой и пользуюсь, кроме всего прочего она ждет в деструкторе завершения потока. Сейчас вроде появился std::jthread
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2021, 10:03
Помогаю со студенческими работами здесь

Семафор
В парикмахерской расположено единственное кресло, на котором спит парикмахер, и несколько стульев для клиентов. Когда клиент приходит в...

[C++] семафор
Рассмотрим взаимодействие двух потоков, один из которых пишет данные в буферный пул, а другой считывает их из пула. Буферный пул состоит из...

Семафор
Помогите пожалуйста с задачей, уже неделю над ней бьюсь: На железнодорожной станции четыре пути (разделяемые ресурсы), на каждом из...

Семафор
Задача производителей и потребителей. Есть 3 программы: менеджер, производитель и потребитель. Менеджер запускает производителей...

Семафор
Написать программу, создающую дочерний процесс. Родительский процесс создаёт семафор (сем1) и общий файл. Дочерний процесс записывает в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru