Вход | Регистрация
 

Самый простой способ создать мьютекс?

Самый простой способ создать мьютекс?
Я
   DTX 4th
 
01.10.20 - 11:24
Знаю, что способов куча. Интересно узнать, кто что использует, когда надо, чтобы код не выполнялся параллельно в несколько потоков?

В данных момент мне нужно обработать записи в регистре сведений. На чтение его блокировать не нужно для других участков кода
   polosov
 
1 - 01.10.20 - 11:32
(0) Подробнее задачу опиши.
   ДенисЧ
 
2 - 01.10.20 - 11:39
Обработать - это изменить записи? И в это же время не блокировать их на чтение?
   Мойдодыр
 
3 - 01.10.20 - 11:40
если транзакции не нужны то можно ЗаблокироватьДляРедактирования
   Мойдодыр
 
4 - 01.10.20 - 11:41
в любом случае запись блокирует чтение, тк вызывает неявную блокировку
   DTX 4th
 
5 - 01.10.20 - 11:44
(1) В регистре лежат пиьсма на отправку. Я отбираю те, где "Обработано = Ложь", дальше идут по каждому, отправляю, менеджером записи меняю флаг Обработано
   DTX 4th
 
6 - 01.10.20 - 11:45
(5) При этом читать регистр запрещать не нужно из других мест. И добавлять туда данные тоже должно быть можно
   DTX 4th
 
7 - 01.10.20 - 11:48
Вот тут предлагают файлом:
http://catalog.mista.ru/1c/articles/384485/

Но это сработает только если модуль чисто серверный.
Хочется что-то вроде
Документы.Док1.СоздатьОбъект().Заблокировать()

Вроде натыкался на что-то подобное, но сейчас не могу найти
   Волшебник
 
8 - 01.10.20 - 11:48
Параллельная запись в независимый регистр сведений — узкое место. В любой момент блокировка может распространиться на весь регистр.
   DTX 4th
 
9 - 01.10.20 - 11:50
(8) Запись занимает доли секунду - не страшно.

Сейчас думаю создать РС "Блокировки" и процедуру Заблокировать(ИмяБлокировки). И там уже управляемую блокировку накладывать.
Еще варианты?
   fisher
 
10 - 01.10.20 - 11:53
ИМХО, лучше всего на роль мьютекса подходит Заблокировать(). Не та, которая управляемые блокировки, а та которая объектные. На каком-то служебном элементе можно.
   Волшебник
 
11 - 01.10.20 - 11:56
(10) Соглашусь. Можно завести предопределённый элемент справочника и блокировать его через
Попытка
Объект.Заблокировать()
   acht
 
12 - 01.10.20 - 12:02
Управляемые блокировки и порцbонная обработка для минимальных транзакций - они для лохов, точно-точно.
   Garykom
 
13 - 01.10.20 - 12:03
(0) Регламентное или используй объекты которые в измерениях РС
   polosov
 
14 - 01.10.20 - 12:03
(5) Не совсем понятно зачем тебе мьютекс.
Я реализовывал так: регламент читает записи в РС где "Отправлено = Ложь", спокойно пробегаюсь по списку отправки и после каждого успешного письма пишу в РС "Отправлено = Истина". В это время спокойно другие записи могут добавляться в РС "К отправке".
   DTX 4th
 
15 - 01.10.20 - 12:08
(14) По задумке некоторые письма должны улетать сразу, если вызвать РС.Рассылка.ОтправитьСейчас()
Если в этот момент будет выполняться регламентное задание, то они могу по два раза письмо отправить
Пока что самое универсальное на мой взгляд - (9)
   polosov
 
16 - 01.10.20 - 12:14
(15) Почему бы тебе не стартовать регламент руками?
&НаСервере
Процедура ЗапуститьРегламентноеЗадание()
   ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;

  // Проверка, выполняется ли фоновое задание по очистке устаревших версий.

   Отбор = Новый Структура;
   Отбор.Вставить("ИмяМетода", ИмяМетода);
   Отбор.Вставить("Состояние", СостояниеФоновогоЗадания.Активно);
   ФоновыеЗаданияОчистки = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
   Если ФоновыеЗаданияОчистки.Количество() = 0 Тогда
      НаименованиеФоновогоЗадания = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Запуск вручную: %1'"), РегламентноеЗаданиеМетаданные.Синоним);
      ФоновыеЗадания.Выполнить(ИмяМетода,,, НаименованиеФоновогоЗадания);
   КонецЕсли;
КонецПроцедуры
   DTX 4th
 
17 - 01.10.20 - 12:16
(16) Хм, интересно. Под задачу подходит.

ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);

отрабатывает быстро?

Точно не получится, что два задания одинаковых стартануть? Че-т стремновато)
   polosov
 
18 - 01.10.20 - 12:18
(17) Нормально отрабатывает. Давно таким пользуюсь.
   polosov
 
19 - 01.10.20 - 12:21
(17) Вообще проверку на запущенное фоновое надо перенести в сам метод, который вызывает регламентное задание. Чтобы проверка была и при ручном запуске и при автоматическом.
   fisher
 
20 - 01.10.20 - 12:30
(19) А если вручную запускать фоновое с тем же ключом - запустится параллельно? Если без явной проверки внутри?
   polosov
 
21 - 01.10.20 - 12:32
(20) Не пробовал, но по идее должно запуститься.
   acht
 
22 - 01.10.20 - 12:34
Блокировки делайте.
Иначе придет какой-нибудь обмен данными, который про ваши экзерсисы ну вообще ничего не знает и запишет вам всё по-своему.
   fisher
 
23 - 01.10.20 - 12:34
(21) "Если ключ задан, то он должен быть уникальным среди ключей активных фоновых заданий, имеющих такое же имя метода, что и у данного фонового задания"
То есть может получится обойтись и без явной проверки внутри.
   fisher
 
24 - 01.10.20 - 12:35
То есть можно попробовать тупо шарашить ручное фоновое и если оно с тем же ключом что и работающее, то по-идее просто не должно запуститься.
   mikecool
 
25 - 01.10.20 - 12:43
(20) нет, или не запустится, или исключение выдаст
   mistеr
 
26 - 01.10.20 - 12:48
(5) Задача выборки заданий из очереди не так проста как может показаться.

В первом приближении решается блокировкой чтения.

    ВЫБРАТЬ ПЕРВЫЕ 1 ...
    ...
    ГДЕ Обработано = Ложь
    ДЛЯ ИЗМЕНЕНИЯ
   DTX 4th
 
27 - 01.10.20 - 12:54
Че-т не работает
https://i.imgur.com/84ks3kq.png
https://i.imgur.com/O7AubCP.png
https://i.imgur.com/b5V52zE.png

(26) Блокировка будет наложена на весь регистр?
   DTX 4th
 
28 - 01.10.20 - 12:55
(27) Не тот скрин.
https://i.imgur.com/Jz6Tut3.png

В регистре записей нет. Имя - измерение. Кроме одного измерения там ничего нет.
   DTX 4th
 
29 - 01.10.20 - 13:44
Никто блокировки в повседневной жизни не использует?)
   Cyberhawk
 
30 - 01.10.20 - 14:11
Если нужно ожидание, то упр. блокировка на любое не мешающее другим пространство.
Если отлуп нужен мгновенный - то ЗаблокироватьДанныеДляРедактирования на аналогно не мешающий другим объект БД.
 
 Рекламное место пустует
   DTX 4th
 
31 - 01.10.20 - 14:25
(30) В (27) я вроде так и сделал, но че-т не работает
   DTX 4th
 
32 - 01.10.20 - 14:25
У РС режим управления блокировками - Управляемый
   Cyberhawk
 
33 - 01.10.20 - 15:24
(31) Разглядывать картинки лично мне охоты нет, извиняй
   mistеr
 
34 - 01.10.20 - 15:57
(27) На выбранные записи.
   Сияющий в темноте
 
35 - 01.10.20 - 20:18
у фонового задания есть идентификатор и нельзя запустить несколько заданий с одинаковым идентификатором
дальше продолжать?
   Сияющий в темноте
 
36 - 01.10.20 - 20:20
как бы,можно и с клиента запустить фончик и убедиться,что он один такой и твой.
   Сияющий в темноте
 
37 - 01.10.20 - 20:22
просто,использование блокировки чего либо накладывает ограничение на использование транзакций.
   acht
 
38 - 01.10.20 - 23:42
(37) Ээээ, что?
   Cyberhawk
 
39 - 02.10.20 - 14:55
(38) Наверное, он про то, что мьютекс через упр. блокировку возможен только в рамках транзакции
   sr23
 
40 - 02.10.20 - 15:50
ТС просто решил очередной раз понтануться, узнал новое слово) http://prntscr.com/urw5bq
   spock
 
41 - 02.10.20 - 15:59
Например, так:

// file.h

//
class XXX {
public:
    void doSomethingConcurrent() const;
private:
    mutable std::recursive_mutex m_mutex;
};
// file.cpp

//
void XXX:doSomethingConcurrent() const {
    std::unique_lock<std::recursive_mutex> localLocker(m_mutex);

    // #uhooo now!


}
   2mugik
 
42 - 02.10.20 - 19:21
(0)делал обмен. сделал РС измененные объекты, куда подпиской при записи нужных объектов(справочники,документы) писался код объекта. При порционной выгрузке объектов РС блокировался по списку кодов выгружемых по 100 штук.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.