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

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

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

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

15.06.2014, 14:36. Просмотров 770. Ответов 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
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 16:34  [ТС] #16
Алгоритм Деккера заиспользую короче, и не буду париться
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
15.06.2014, 16:39 #17
Цитата Сообщение от Praktolock Посмотреть сообщение
Алгоритм Деккера заиспользую короче, и не буду париться
Про барьеры не забудьте.
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
16.06.2014, 02:33  [ТС] #18
Ну короче вот так:

buffer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vector>
 
struct STBUFFER
{
 
 std::vector<char>data;
 volatile int rbusy;
 volatile int wbusy;
 volatile int turn;
 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "buffer.h"
 
STBUFFER::STBUFFER()
{
 rbusy=0;
 wbusy=0;
 turn =0;
};
 
void STBUFFER::gonnawrite()
{
 wbusy=1;
 while(rbusy)
 {
  if(!turn)
  {
   wbusy=0;
   while(!turn){/*sleep*/};
   wbusy=1;
  }
 }
};
 
void STBUFFER::finishedwrite()
{
 wbusy=0;
 turn=0;
};
 
void STBUFFER::gonnaread()
{
 rbusy=1;
 while(wbusy)
 {
  if(turn)
  {
   rbusy=0;
   while(turn){/*sleep*/};
   rbusy=1;
  }
 }
};
 
void STBUFFER::finishedread()
{
 rbusy=0;
 turn=1;
};
 
int STBUFFER::read(char*_buf, int _sz)
{
 gonnaread();
 //читаем
 finishedread();
 return(0);
};
 
int STBUFFER::write(char*_buf, int _sz)
{
 gonnawrite();
 //пишем
 finishedwrite();
 return(0);
};
Не смог придумать адекватного названия переменной turn.
0
Убежденный
Ушел с форума
Эксперт С++
15697 / 7207 / 1139
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
16.06.2014, 08:31 #19
Цитата Сообщение от Praktolock
C++
1
2
wbusy=1;
while(rbusy)
На IA-32/AMD64 эта конструкция не гарантирует нужный эффект.
Дело в том, что CPU может выполнять последовательность "чтение-запись" в
обратном порядке. И получится здесь проверка rbusy раньше, чем установка
wbusy в 1. Между этими строками (и не только здесь) нужно вставить
хардварный барьер. И снова мы выходим на платформенные рельсы...
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
16.06.2014, 08:42  [ТС] #20
Цитата Сообщение от Убежденный Посмотреть сообщение
И получится здесь проверка rbusy раньше, чем установка
wbusy в 1.
Ну и ладно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
void STBUFFER::gonnaread()
{
 while(wbusy)
 {
  rbusy=1;
  if(turn)
  {
   rbusy=0;
   while(turn){/*sleep*/};
   rbusy=1;
  }
 }
Даже так работать должно жеж

Добавлено через 54 секунды
или нет?
0
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
19.06.2014, 17:35  [ТС] #21
А чо мне никто сокеты использовать не подсказал, вполне же себе кроссплатформенно
0
0x10
2479 / 1652 / 248
Регистрация: 24.11.2012
Сообщений: 4,093
19.06.2014, 17:48 #22
Сокеты - не есть примитивы синхронизации. И вполне себе платформозависимы.
0
19.06.2014, 17:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 17:48
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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