Имя: Пароль:
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 штук.
Основная теорема систематики: Новые системы плодят новые проблемы.