Форум программистов, компьютерный форум CyberForum.ru

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

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

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

15.06.2014, 14:36. Просмотров 734. Ответов 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);
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2014, 14:36     Буферы и синхронизация потоков
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
15.06.2014, 16:34  [ТС]     Буферы и синхронизация потоков #16
Алгоритм Деккера заиспользую короче, и не буду париться
Убежденный
Системный программист
Эксперт С++
15299 / 6931 / 1096
Регистрация: 02.05.2013
Сообщений: 11,341
Завершенные тесты: 1
15.06.2014, 16:39     Буферы и синхронизация потоков #17
Цитата Сообщение от Praktolock Посмотреть сообщение
Алгоритм Деккера заиспользую короче, и не буду париться
Про барьеры не забудьте.
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.
Убежденный
Системный программист
Эксперт С++
15299 / 6931 / 1096
Регистрация: 02.05.2013
Сообщений: 11,341
Завершенные тесты: 1
16.06.2014, 08:31     Буферы и синхронизация потоков #19
Цитата Сообщение от Praktolock
C++
1
2
wbusy=1;
while(rbusy)
На IA-32/AMD64 эта конструкция не гарантирует нужный эффект.
Дело в том, что CPU может выполнять последовательность "чтение-запись" в
обратном порядке. И получится здесь проверка rbusy раньше, чем установка
wbusy в 1. Между этими строками (и не только здесь) нужно вставить
хардварный барьер. И снова мы выходим на платформенные рельсы...
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 секунды
или нет?
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
19.06.2014, 17:35  [ТС]     Буферы и синхронизация потоков #21
А чо мне никто сокеты использовать не подсказал, вполне же себе кроссплатформенно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2014, 17:48     Буферы и синхронизация потоков
Еще ссылки по теме:

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

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

Синхронизация процессов - C++
std::mutex позволяет синхронизировать несколько разных потоков. А есть ли в std что ни будь для синхронизации процессов? То есть, программа...

Синхронизация мьютекс - C++
Привет, на данный момент пытаюсь научиться пользоваться синхронизацией. Есть такой код: #include &lt;iostream&gt; #include &lt;chrono&gt; ...


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

Или воспользуйтесь поиском по форуму:
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
19.06.2014, 17:48     Буферы и синхронизация потоков #22
Сокеты - не есть примитивы синхронизации. И вполне себе платформозависимы.
Yandex
Объявления
19.06.2014, 17:48     Буферы и синхронизация потоков
Ответ Создать тему
Опции темы

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