73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|||||||||||
1 | |||||||||||
Буферы и синхронизация потоков15.06.2014, 14:36. Показов 2530. Ответов 21
Метки нет Все метки)
(
Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические библиотеки) создает поток с функцией из этого плагина и весь обмен происходит через буферы, которые нужно блокировать ну чтобы там писать/читать одновременно нельзя было. Для каждого плагина ровно 2 буфера, 1 для вывода из плагина, 1 для ввода. Не хочу использовать платформенно зависимые средства и буст тоже использовать не хочу. Оцените пожалуйста, бегло просмотрев, как оно норм работать будет? Ну именно блокирование.
buffer.h
0
|
|
15.06.2014, 14:36 | |
Ответы с готовыми решениями:
21
Синхронизация потоков в c++
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 14:50 | 2 |
1. Еще раз задуматься об архитектуре. Возможно ли обращение из нескольких потоков к потокам? Обязательно ли взаимодействие через потоки? Пока мотивации не вижу.
2. Свои велосипеды на выброс. Если и заработает, то как минимум, работать будет неэффективно. Циклами с ожиданием - только проц греть.
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||
15.06.2014, 14:57 [ТС] | 3 | |||||
он не будет пустым, там оставлено место под какойнибудь sleep, например
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 15:00 | 4 |
И да - работать не будет.
Добавлено через 1 минуту Предположим, такая ситуация. Два потока хотят начать записывать данные. Поток 1 - проверка условия wbusy - писать можно. Поток 2 - проверка условия - писать можно Поток 2 - увеличение значения wbusy Поток 1 - увеличение значения wbusy И вот у нас уже два потока ломятся на запись.
1
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
15.06.2014, 15:27 [ТС] | 5 |
Не не, не так, пишет только 1, читает только 1. Они не будут оба пытаться писать
0
|
2777 / 1930 / 570
Регистрация: 05.06.2014
Сообщений: 5,594
|
|
15.06.2014, 15:28 | 6 |
1
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 15:32 | 7 |
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
15.06.2014, 15:35 [ТС] | 8 |
2 флага: rbisy - означает, что буфер занят тем что в него пишут, wbisy - читают.
А по коду можно не увидеть, т.к. он же впринципе не рабочий) Я и сам уже это вижу
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 15:37 | 9 |
Praktolock, функции захвата этого самопального мьютекса неатомрны, что я и показал на примере выше.
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
15.06.2014, 15:39 [ТС] | 10 |
Я убежден, что им вовсе не обязательно быть таковыми
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 15:41 | 11 |
0
|
Ушел с форума
![]() |
|
15.06.2014, 15:43 | 12 |
Это ничего принципиально не меняет.
Поток А входит в gonnaread, видит, что wbisy равен нулю и получает доступ на чтение. В это же время поток Б входит в gonnawrite, видит, что rbisy тоже обнулен и получает доступ на запись. Гонка! Не по теме:
Кстати, запись "while (var > 0)" легко может быть соптимизирована компилятором до чтения var из регистра, в результате чего поток вообще никогда не выйдет из цикла. Так что здесь еще нужно дополнительное условие (например, volatile), чтобы цикл заработал как требуется.
1
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||
15.06.2014, 15:54 [ТС] | 13 | |||||
А если так?
а нет, тоже фигня. Совсем чота сварить не могу
0
|
Ушел с форума
![]() |
|
15.06.2014, 15:59 | 14 |
Вместо rbisy++ и wbisy++ можно использовать "Compare and swap" (CAS).
Например, в Windows это будет InterlockedCompareExchange. Атомарно. Но это уже платформенные средства...
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
15.06.2014, 16:01 | 15 |
У gcc есть встроенные атомарные функции - http://gcc.gnu.org/onlinedocs/... ltins.html
Опять же - только для одного компилятора. Простая известная вещь - доступ к разделяемым ресурсам нужно контролировать. std::mutex и все около него в помощь, выше уже упоминали.
1
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|
15.06.2014, 16:34 [ТС] | 16 |
Алгоритм Деккера заиспользую короче, и не буду париться
0
|
Ушел с форума
![]() |
|
15.06.2014, 16:39 | 17 |
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
|||||||||||
16.06.2014, 02:33 [ТС] | 18 | ||||||||||
Ну короче вот так:
buffer.h
0
|
Ушел с форума
![]() |
|
16.06.2014, 08:31 | 19 |
![]() Дело в том, что CPU может выполнять последовательность "чтение-запись" в обратном порядке. И получится здесь проверка rbusy раньше, чем установка wbusy в 1. Между этими строками (и не только здесь) нужно вставить хардварный барьер. И снова мы выходим на платформенные рельсы...
0
|
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
|
||||||
16.06.2014, 08:42 [ТС] | 20 | |||||
Ну и ладно.
Добавлено через 54 секунды или нет?
0
|
16.06.2014, 08:42 | |
16.06.2014, 08:42 | |
Помогаю со студенческими работами здесь
20
Синхронизация потоков
Синхронизация процессов и потоков Синхронизация потоков Event c++ Синхронизация потоков на семафорах Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |