|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|||||||||||
Буферы и синхронизация потоков15.06.2014, 14:36. Показов 3309. Ответов 21
Метки нет (Все метки)
Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические библиотеки) создает поток с функцией из этого плагина и весь обмен происходит через буферы, которые нужно блокировать ну чтобы там писать/читать одновременно нельзя было. Для каждого плагина ровно 2 буфера, 1 для вывода из плагина, 1 для ввода. Не хочу использовать платформенно зависимые средства и буст тоже использовать не хочу. Оцените пожалуйста, бегло просмотрев, как оно норм работать будет? Ну именно блокирование.
buffer.h
0
|
|||||||||||
| 15.06.2014, 14:36 | |
|
Ответы с готовыми решениями:
21
Синхронизация потоков в c++
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 14:50 | |
|
1. Еще раз задуматься об архитектуре. Возможно ли обращение из нескольких потоков к потокам? Обязательно ли взаимодействие через потоки? Пока мотивации не вижу.
2. Свои велосипеды на выброс. Если и заработает, то как минимум, работать будет неэффективно. Циклами с ожиданием - только проц греть.
0
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||||
| 15.06.2014, 14:57 [ТС] | ||||||||
0
|
||||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 15:00 | |
|
И да - работать не будет.
Добавлено через 1 минуту Предположим, такая ситуация. Два потока хотят начать записывать данные. Поток 1 - проверка условия wbusy - писать можно. Поток 2 - проверка условия - писать можно Поток 2 - увеличение значения wbusy Поток 1 - увеличение значения wbusy И вот у нас уже два потока ломятся на запись.
1
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
| 15.06.2014, 15:27 [ТС] | |
|
Не не, не так, пишет только 1, читает только 1. Они не будут оба пытаться писать
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 15.06.2014, 15:28 | ||
1
|
||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 15:32 | |
|
0
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
| 15.06.2014, 15:35 [ТС] | |
|
2 флага: rbisy - означает, что буфер занят тем что в него пишут, wbisy - читают.
А по коду можно не увидеть, т.к. он же впринципе не рабочий) Я и сам уже это вижу
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 15:37 | |
|
Praktolock, функции захвата этого самопального мьютекса неатомрны, что я и показал на примере выше.
0
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
| 15.06.2014, 15:39 [ТС] | |
|
Я убежден, что им вовсе не обязательно быть таковыми
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 15:41 | |
|
0
|
|
|
Ушел с форума
|
||
| 15.06.2014, 15:43 | ||
|
Поток А входит в gonnaread, видит, что wbisy равен нулю и получает доступ на чтение. В это же время поток Б входит в gonnawrite, видит, что rbisy тоже обнулен и получает доступ на запись. Гонка! Не по теме:
Кстати, запись "while (var > 0)" легко может быть соптимизирована компилятором до чтения var из регистра, в результате чего поток вообще никогда не выйдет из цикла. Так что здесь еще нужно дополнительное условие (например, volatile), чтобы цикл заработал как требуется.
1
|
||
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||
| 15.06.2014, 15:54 [ТС] | ||||||
|
А если так?
а нет, тоже фигня. Совсем чота сварить не могу
0
|
||||||
|
Ушел с форума
|
|
| 15.06.2014, 15:59 | |
|
Вместо rbisy++ и wbisy++ можно использовать "Compare and swap" (CAS).
Например, в Windows это будет InterlockedCompareExchange. Атомарно. Но это уже платформенные средства...
0
|
|
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
| 15.06.2014, 16:01 | |
|
У gcc есть встроенные атомарные функции - http://gcc.gnu.org/onlinedocs/... ltins.html
Опять же - только для одного компилятора. Простая известная вещь - доступ к разделяемым ресурсам нужно контролировать. std::mutex и все около него в помощь, выше уже упоминали.
1
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
| 15.06.2014, 16:34 [ТС] | |
|
Алгоритм Деккера заиспользую короче, и не буду париться
0
|
|
|
Ушел с форума
|
|
| 15.06.2014, 16:39 | |
|
0
|
|
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|||||||||||
| 16.06.2014, 02:33 [ТС] | |||||||||||
|
Ну короче вот так:
buffer.h
0
|
|||||||||||
|
Ушел с форума
|
||
| 16.06.2014, 08:31 | ||
Дело в том, что CPU может выполнять последовательность "чтение-запись" в обратном порядке. И получится здесь проверка rbusy раньше, чем установка wbusy в 1. Между этими строками (и не только здесь) нужно вставить хардварный барьер. И снова мы выходим на платформенные рельсы...
0
|
||
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|||||||
| 16.06.2014, 08:42 [ТС] | |||||||
Добавлено через 54 секунды или нет?
0
|
|||||||
| 16.06.2014, 08:42 | |
|
Помогаю со студенческими работами здесь
20
Синхронизация потоков
Синхронизация процессов и потоков Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|