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

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

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

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

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

Пока что самое универсальное на мой взгляд - (9)
16 polosov
 
01.10.20
12:14
(15) Почему бы тебе не стартовать регламент руками?
&НаСервере
Процедура ЗапуститьРегламентноеЗадание()
   ИмяМетода = Метаданные.РегламентныеЗадания.ОчисткаУстаревшихВерсийОбъектов.ИмяМетода;

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

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

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

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

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

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

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

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

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