Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
#1

Буферы и синхронизация потоков - C++

15.06.2014, 14:36. Просмотров 773. Ответов 21
Метки нет (Все метки)

Всем привет. Суть такова: есть(будет) некая софтина которая подгружает плагины(дмнамические библиотеки) создает поток с функцией из этого плагина и весь обмен происходит через буферы, которые нужно блокировать ну чтобы там писать/читать одновременно нельзя было. Для каждого плагина ровно 2 буфера, 1 для вывода из плагина, 1 для ввода. Не хочу использовать платформенно зависимые средства и буст тоже использовать не хочу. Оцените пожалуйста, бегло просмотрев, как оно норм работать будет? Ну именно блокирование.

buffer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#include <vector>
 
struct STBUFFER
{
 std::vector<char>data;//а может и не вектор, еще я не решил
 int rbisy;
 int wbisy;
 STBUFFER();
 void gonnawrite();
 void gonnaread ();
 void finishedwrite();
 void finishedread ();
 
 int read(char*, int);
 int write(char*, int);
};
buffer.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "buffer.h"
 
STBUFFER::STBUFFER()
{
 rbisy=0;
 wbisy=0;
};
 
void STBUFFER::gonnawrite()
{
 while(rbisy>0){/*какаянибудь пурга*/};
 wbisy++;
};
 
void STBUFFER::finishedwrite()
{
 wbisy--;
};
 
void STBUFFER::gonnaread()
{
 while(wbisy>0){/*какаянибудь пурга*/};
 rbisy++;
};
 
void STBUFFER::finishedread()
{
 rbisy--;
};
 
int STBUFFER::read(char*_buf, int _sz)
{
 gonnaread();
 //читаем, удоляем
 finishedread();
 return(0);
};
 
int STBUFFER::write(char*_buf, int _sz)
{
 gonnawrite();
 //пишем
 finishedwrite();
 return(_sz);
};
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2014, 14:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Буферы и синхронизация потоков (C++):

синхронизация потоков - C++
проблема в следующем: есть 2 потока один считает некоторую сумму в цикле по столбцам матрицы второй должен выводить промежуточную...

Синхронизация потоков в c++ - C++
Совершенно не понятно что не так и как правильно. Задача: Отсортировать массив целых чисел. Программу разбить на два синхронизированных...

Синхронизация потоков - C++
Есть статический класс к которому я хочу обращаться из разных потоков static class MyLog { public: static int log(std::string,...

Синхронизация потоков на семафорах - C++
почему не работает синхронизация потоков на семафорах? при компиляции ошибка сегментирования. На мютексах работает корректно. Потоки...

Синхронизация потоков Event c++ - C++
Необходимо, чтобы нить t4 ждала события просчета времени &quot;time = 1000 * (getTime() - time);&quot; и после этого запускалась. Как реализовать?...

Синхронизация потоков - уведомление о событии - C++
Здравствуйте. Я хочу реализовать параллельную одновременную работу двух потоков, один из которых получает сообщения о событиях в...

21
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 14:50 #2
1. Еще раз задуматься об архитектуре. Возможно ли обращение из нескольких потоков к потокам? Обязательно ли взаимодействие через потоки? Пока мотивации не вижу.
2. Свои велосипеды на выброс. Если и заработает, то как минимум, работать будет неэффективно. Циклами с ожиданием - только проц греть.
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 14:57  [ТС] #3
Цитата Сообщение от 0x10 Посмотреть сообщение
Циклами с ожиданием - только проц греть.
он не будет пустым, там оставлено место под какойнибудь sleep, например
C++
1
while(wbisy>0){/*какаянибудь пурга*/};
Цитата Сообщение от 0x10 Посмотреть сообщение
1. Еще раз задуматься об архитектуре. Возможно ли обращение из нескольких потоков к потокам? Обязательно ли взаимодействие через потоки? Пока мотивации не вижу.
Только 1 поток может писать только в 1 буфер, и только он может читать только из 1 другого буфера. В то время как 2-ой поток можеть писать только в 1 буфер, в тот с которого читает первый поток, и только он один можеть читать с буфера в который можеть писать один единственный поток (1-й). как-то так. На мой взгляд, архитектура идеальна.
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 15:00 #4
И да - работать не будет.

Добавлено через 1 минуту
Предположим, такая ситуация. Два потока хотят начать записывать данные.
Поток 1 - проверка условия wbusy - писать можно.
Поток 2 - проверка условия - писать можно
Поток 2 - увеличение значения wbusy
Поток 1 - увеличение значения wbusy

И вот у нас уже два потока ломятся на запись.
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 15:27  [ТС] #5
Не не, не так, пишет только 1, читает только 1. Они не будут оба пытаться писать
0
Renji
2014 / 1382 / 312
Регистрация: 05.06.2014
Сообщений: 3,943
15.06.2014, 15:28 #6
Не хочу использовать платформенно зависимые средства и буст тоже использовать не хочу.
std::mutex. Стандартная библиотека, однако.
1
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 15:32 #7
Цитата Сообщение от Praktolock Посмотреть сообщение
Не не, не так, пишет только 1, читает только 1
По коду я не вижу, чтобы это где-то гарантировалось.
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 15:35  [ТС] #8
2 флага: rbisy - означает, что буфер занят тем что в него пишут, wbisy - читают.
А по коду можно не увидеть, т.к. он же впринципе не рабочий) Я и сам уже это вижу
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 15:37 #9
Praktolock, функции захвата этого самопального мьютекса неатомрны, что я и показал на примере выше.
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 15:39  [ТС] #10
Я убежден, что им вовсе не обязательно быть таковыми
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 15:41 #11
Цитата Сообщение от Praktolock Посмотреть сообщение
Я убежден, что им вовсе не обязательно быть таковыми
Happy debugging.
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.06.2014, 15:43 #12
Цитата Сообщение от Praktolock Посмотреть сообщение
Не не, не так, пишет только 1, читает только 1. Они не будут оба пытаться писать
Это ничего принципиально не меняет.
Поток А входит в gonnaread, видит, что wbisy равен нулю и получает
доступ на чтение. В это же время поток Б входит в gonnawrite, видит,
что rbisy тоже обнулен и получает доступ на запись. Гонка!

Не по теме:


Правильно "busy", а не "bisy".



Кстати, запись "while (var > 0)" легко может быть соптимизирована
компилятором до чтения var из регистра, в результате чего поток вообще
никогда не выйдет из цикла. Так что здесь еще нужно дополнительное
условие (например, volatile), чтобы цикл заработал как требуется.
1
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 15:54  [ТС] #13
А если так?
C++
1
2
3
4
5
6
7
8
9
10
11
void STBUFFER::gonnawrite()
{
 wbisy++;
 while(rbisy>0){/*какаянибудь пурга*/};
};
 
void STBUFFER::gonnaread()
{
 rbisy++;
 while(wbisy>0){/*какаянибудь пурга*/};
};
Добавлено через 3 минуты
а нет, тоже фигня. Совсем чота сварить не могу
0
Убежденный
Ушел с форума
Эксперт С++
15708 / 7218 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.06.2014, 15:59 #14
Вместо rbisy++ и wbisy++ можно использовать "Compare and swap" (CAS).
Например, в Windows это будет InterlockedCompareExchange. Атомарно.
Но это уже платформенные средства...
0
0x10
2482 / 1657 / 249
Регистрация: 24.11.2012
Сообщений: 4,125
15.06.2014, 16:01 #15
У gcc есть встроенные атомарные функции - http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html
Опять же - только для одного компилятора.
Простая известная вещь - доступ к разделяемым ресурсам нужно контролировать. std::mutex и все около него в помощь, выше уже упоминали.
1
15.06.2014, 16:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2014, 16:01
Привет! Вот еще темы с ответами:

Синхронизация потоков, события, WinAPI - C++
Уважаемые программисты! Решается такая задача: 5 потоков генерируют псевдослучайные числа, главный поток выводит их, при нажатии &quot;enter&quot;...

Синхронизация потоков при работе с файлом - C++
Доброго времени суток! У меня такая проблема: многопоточные приложения я не писал ни разу, но, в целом, имею представление о них....

Синхронизация потоков ввода и вывода в Eclipce CDT - C++
Недавно перешел на программирование на Eclipse, но загвоздка в том, что если нужно ввести какое-то значение, то его ввод вызывается до...

Написать программу подсчета количества строк в файле (желательно, не используя буферы) - C++
Добрый день. У меня такая проблема, нужно посчитать количество строк в файле, но без буферизации, так как файл может быть очень большим....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.