Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / создание и удаление объектов в многопоточном приложении / 8 сообщений из 8, страница 1 из 1
25.03.2013, 23:41
    #38198031
PeterXa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
Есть поток A и B. A создает буффер, отдает его B и активно в него пишет данные, а B эти данные читает. В любой момент данные для B могут стать неактуальными и буфер для B уже будет не нужен, но A продолжает туда писать и остановить его нельзя. С другой стороны A может записать все данные в буффер, но B необходимо некоторое время чтобы их вычитать. Посоветуйте как удалять этот самый буфер?
...
Рейтинг: 0 / 0
25.03.2013, 23:53
    #38198039
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXaПосоветуйте как удалять этот самый буфер?
Лучше всего - никак. Сделать его кольцевым и пусть А не пишет, поке В не прочитает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.03.2013, 23:57
    #38198045
PeterXa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
Dimitry SibiryakovPeterXaПосоветуйте как удалять этот самый буфер?
Лучше всего - никак. Сделать его кольцевым и пусть А не пишет, поке В не прочитает.


Проблемма в том, что данные в A имеют конечный объем - они когда-нибудь кончатся и буфер придется удалять.
...
Рейтинг: 0 / 0
26.03.2013, 00:08
    #38198051
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXaПроблемма в том, что данные в A имеют конечный объем - они когда-нибудь
кончатся и буфер придется удалять.
Зачем? Буфер пустой - он предмет простой, он никуда не денется. И потому буфер пустой
гораздо выше ценится. Удалишь когда В будет извещён, что данные кончатся, подтвердит это и
умрёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.03.2013, 01:33
    #38198091
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXa,

Используйте std::shared_ptr (или boost::shared_ptr если у вас нет поддержки С++11) для хранения буфера.
У каждого потока должна быть своя копия shared_ptr.
Когда последняя копия указателя выйдет из области видимости объект будет уничтожен.
Эта операция - потокобезопасна.

Например:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
void thread_a(boost::shared_ptr<Buffer> buffer)
{
    buffer.put_data();
    buffer.signal()
}
void thread_b(boost::shared_ptr<Buffer> buffer)
{
    buffer.wait_for_signal();
    buffer.read_data();
}
int main()
{
    boost::shared_ptr<Buffer> buffer(new Buffer());
    boost::thread t1(boost::bind(thread_a, buffer));
    boost::thread t2(boost::bind(thread_b, buffer));
    buffer.reset(); // уже не нужен
    t1.join();
    t2.join();
}
...
Рейтинг: 0 / 0
26.03.2013, 03:09
    #38198113
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXaЕсть поток A и B. A создает буффер, отдает его B и активно в него пишет данные, а B эти данные читает. В любой момент данные для B могут стать неактуальными и буфер для B уже будет не нужен, но A продолжает туда писать и остановить его нельзя. С другой стороны A может записать все данные в буффер, но B необходимо некоторое время чтобы их вычитать. Посоветуйте как удалять этот самый буфер?
Получается что у потока А есть какая-то инерция. И он даже получив сигнал сделает
еще хотя-бы несколько холостых записей в буфер. Не нужно ему мешать. Пускай сделает.
...
Рейтинг: 0 / 0
26.03.2013, 10:03
    #38198236
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXaЕсть поток A и B. A создает буффер, отдает его B и активно в него пишет данные, а B эти данные читает. В любой момент данные для B могут стать неактуальными и буфер для B уже будет не нужен, но A продолжает туда писать и остановить его нельзя. С другой стороны A может записать все данные в буффер, но B необходимо некоторое время чтобы их вычитать. Посоветуйте как удалять этот самый буфер?

Так а что не ясно ? Синхронизировать-то потоки всё равно надо, а там уж как его удалять -- не проблема, хотя бы тот же счётчик
использования сделать, как в 0 -- удаляется буфер.
...
Рейтинг: 0 / 0
26.03.2013, 12:57
    #38198497
ДохтаР
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
создание и удаление объектов в многопоточном приложении
PeterXaЕсть поток A и B. A создает буффер, отдает его B и активно в него пишет данные, а B эти данные читает. В любой момент данные для B могут стать неактуальными и буфер для B уже будет не нужен, но A продолжает туда писать и остановить его нельзя. С другой стороны A может записать все данные в буффер, но B необходимо некоторое время чтобы их вычитать. Посоветуйте как удалять этот самый буфер?

Что бы небыло лапшекода, удалять должен тот* , кто создавал.

*Тот - некий класс** имеющий алокатор-деалокатор.

**Класс- тип, а не экземпляр, не имеет значения в какой нити вызываются его методы.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / создание и удаление объектов в многопоточном приложении / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]