LINUX.ORG.RU

вопрос по синхронизации

 


0

1

здравствуйте! подскажите как поступить: под ОС linux на qt пишется программа. основной поток по сигналу таймера (интервал 10-20 мс) рисует из матрицы M[4096][2400] по принципу: если в ячейке «1»-то рисуем пиксель(point),если «0»-то ничего не выводим. второй поток представляет из себя бесконечный цикл, и отвечает за прием данных по сети (с высокой частотой), их обработку и запись результатов в эту же матрицу М[4096][2400]. таким образом данная матрица является разделяемым ресурсом, а значит требует синхронизациию. я сделал это через механизм мьютексов, предоставляемый библиотекой qt, но не устраивает скорость. как мне добиться быстродействия? как работают мьютексы?

int g;//др переменные int w;//др переменные int M[4096][2400];//вот матрица которую защитить нужно QMutex mutex; //вот мьютекс int e;//др переменные по аналогии с критическими секциями ВинАпи мютекс защищает только матрицу M или это касается всех переменных объявленных ниже/выше?


да тут вообще мютекс не нужен, имхо

QMutex mutex; //вот мьютекс

мютекс защищает только матрицу M или это касается всех переменных объявленных ниже/выше?

какой феерический бред. Объявление мютекса само по себе ничего не делает. Нужно дергать методы блокировки/разблокировки в коде (из обоих потоков). Между вызовами этих методов работа с ресурсами будет синхронизированной

Harald ★★★★★
()
class Test
{
 QMutex _mutex;
 void Func();
};
void Test::Func()
{
 QMutexLocker lock(&_mutex);
 //твой код тут
}
alpha4
()
Ответ на: комментарий от Harald

почму не нужен? если делаю без мютекса то приложение падает

bejevy
() автор топика
Ответ на: комментарий от solovey

Зачем этот мануал, если приложение на Qt?

ну потому-что:

бесконечный цикл, и отвечает за прием данных по сети (с высокой частотой), их обработку и запись результатов в эту же матрицу

я сделал это через механизм мьютексов, предоставляемый библиотекой qt, но не устраивает скорость. как мне добиться быстродействия?

Наверное мьютекс Qt это обёртка над мьютексом glibc, которая ИМХО поможет увеличить быстродействие.

ЗЫЖ если конечно тут вообще мьютекс нужен, что не факт.

drBatty ★★
()
Ответ на: комментарий от drBatty

Не нужен тут мьютекс, а нужен еще один метод, который будет две «картинки» сводить в одну. Мьютексы тут не помогут. Разница в потреблении памяти смешная, а в скорости выигрыш будет колоссальным.

anonymous
()
Ответ на: комментарий от anonymous

Не нужен тут мьютекс, а нужен еще один метод, который будет две «картинки» сводить в одну. Мьютексы тут не помогут. Разница в потреблении памяти смешная, а в скорости выигрыш будет колоссальным.

наверное ты прав. Условие неполное - совершенно непонятно, является ли допустимым выводить не полностью готовую матрицу. Если недопустимо, то непонятно, какое может быть рассогласование. А если любое может быть, то очевидно нужно просто две матрицы, на вход и выход. А как входная заполнится, атомарно менять их местами (благо есть специальная команда для этого).

drBatty ★★
()
Ответ на: комментарий от drBatty

Да, признаю... Не сразу уловил основную идею твоего сообщения =)

solovey ★★
()

если один поток только записывает либо 1 или 0, а второй только читает, то мутекс вообще не нужен. объяснять почему думаю не надо?

nanoolinux ★★★★
()

не устраивает скорость. как мне добиться быстродействия? как работают мьютексы?

Мютексы работают очень быстро, если все вертится в одном процессе. Может дело не в бобине? Почему ты думаешь что проблема в именно в мютексе?

anonymous
()
Ответ на: комментарий от Harald

да правильно он думает, как научили. есть shared data - нужен мутекс. отличный пример фактологического знания.

nanoolinux ★★★★
()
Ответ на: комментарий от bejevy

подумай. рассмотри задачу про счёт в банке, когда в двух потоках данные извлекаются-модифицируются-записываются, и сравни с твоей, в которой один только записывает, а другой только извлекает.

nanoolinux ★★★★
()
Ответ на: комментарий от Harald

я вообще математик, а не программист. открыл книжку -там написано. тонкости не знаю, вот и справшиваю у опытных прогеров

bejevy
() автор топика
Ответ на: комментарий от bejevy

я вообще математик, а не программист. открыл книжку -там написано. тонкости не знаю, вот и справшиваю у опытных прогеров

А тут в соседнем треде как раз говорят, что математики придумывают алгоритмы, проектируют программы, в общем, решают задачи, в том числе и по типу той, что у тебя в этой теме. Ты уверен, что ты математик?

anonymous
()
Ответ на: комментарий от bejevy

я вообще математик, а не программист. открыл книжку -там написано. тонкости не знаю, вот и справшиваю у опытных прогеров

А где твоя логика, математик? Сдается мне, и математик ты весьма посредственный.

anonymous
()
Ответ на: комментарий от bejevy

ну вот допустим, что ужасного произойдет, если нарисуется не полностью заполненная матрица? Т.е например, часть элементов осталась с прошлого прохода, часть заполнена новыми значениями.

И вообще, как заполняется матрица, последовательно в цикле или каким-то другим способом?

Harald ★★★★★
()

почитай про двойную буферизацию. в 2 словах, пока ты отрисовываешь картинку из одного буфера, ты заполняешь второй, потом пока отрисовываешь картинку из второго, заполняешь первый.
http://ru.wikipedia.org/wiki/Двойная_буферизация

мьютекс тебе не надо потому, что есть только один писатель в общую область памяти.

aol ★★★★★
()
Ответ на: комментарий от anonymous

не базара ноль будет , если по существу кто-нибудь скажет. в документации говорится, что разделяемые ресурсы должны защищаться. я сделал через мютексы. когда же их не использую приложение падает с ошибкой : The inferior stopped because it received a signal from the Operating System. Signal name : SIGSEGV Signal meaning : Segmentation fault

как там на самом деле эти механизмы в ядре ОС реализованы с моего «этажа» прикладного программирования увидеть трудно, тк. это по сути это черный ящик, что подтверждает и рихтер в своей книге.

так я не против критики, если она конструктивна. объясните кто знает?

bejevy
() автор топика
Ответ на: комментарий от Harald

«ну вот допустим, что ужасного произойдет, если нарисуется не полностью заполненная матрица? Т.е например, часть элементов осталась с прошлого прохода, часть заполнена новыми значениями.» ничего страшного не будет

«И вообще, как заполняется матрица, последовательно в цикле или каким-то другим способом?»

заполняется вот так:

каждый раз когда на сетевой адаптер приходят данные считывается положение датчика p, где 0<p<4096

далее идет обработка и результат записывается в матрицу M в ячейку с индексом p-j, 0<j<2400

парараллельно крутится основной поток, который читает из этой матрицы и отображает рез-т обработки

bejevy
() автор топика
Ответ на: комментарий от bejevy

Я не знаю деталей твоей реализации. Может быть у тебя там что-то еще является разделяемым ресурсом, а нам ты тут говоришь, что только матрица. Может быть ты что-то не так с тредами делаешь, кто же знает?

Вообще, тебе уже тут посоветовали использовать двойную буфферизацию. Действуй. Еще можешь поглядеть на: http://qt-project.org/doc/qt-4.8/qreadwritelock.html

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.