LINUX.ORG.RU

Общий объект для нескольких потоков

 


1

3

Добрый день, например, в приложении используются 2 класса(worker1 и worker2), которые работают в разных тредах и есть некий объект(store), доступ к которому должны иметь оба эти класса. Если нужно передать, что-то в этот объект (store), то можно просто воспользоваться слотами-сигналами, а если нужно что-то из этого store получить? Вариант, который приходит на ум: 1. передаем указатель на store каждому воркеру. 2. в методах store при получении каких либо данных юзаем мютекс.

Может есть другие варианты, как более правильно делать подобные вещи?

Какой ЯП, почему он не указан в тегах? В нём должны быть средства для таких задач.

InterVi ★★★★★
()

Юзай мьютекст. Причем ты можешь его расположить и в самом сторе, чтобы не думать при вызовах геттеров-сеттеров, либо, если нужно за одно обращение сделать несколько гетов сетов, пили его глобальным через экстерн и дергай откуда надо.

deep-purple ★★★★★
()
Ответ на: комментарий от InterVi

Да, привык везде видеть, если Qt, то для плюсов, поэтому и пишу подразумевая плюсы, конечно же. Прошу прощения за путаницу.

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

На самом деле Qt иногда используют и с другими языками, например Питоном, но InterVi немного пошутил :-)

cvv ★★★★★
()

юПравильно - это удаление зависимости по данным между потоками. Входные неизменяемые данные можно просто совместно читать, а выходные должны копиться до окончания потока и потом сливаться удобным способом. Всё остальное - костыли и серьёзный удар по параллельности. Но вариантов этого костыля много, начиная от банального mutex, через менее банальный rwlock и до атомарного дрочилова (которое не всегда факт что будет быстрее).

slovazap ★★★★★
()

Вопрос в синхронности операции. Если асинхронно, то ровно так же — с помощью сигналов и слотов. Если не хочется городить колбэки в публичном API — есть лямбды. Если нет лямбд и worker'ы QObject, то можно послать им event в ответ.

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

Не согласен.

Шмем + семафоры используются для «общения» между процессами — разными процессами.

Мьютекс же, не может быть использован между процессами (на самом деле можно, но это уже извращенье). И более подходящим для ТСа и его одного процесса будет именно мьютекс.

deep-purple ★★★★★
()
Ответ на: комментарий от InterVi

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

Заранее известно, что никаких межпроцессных фич не будет и не надо. Так зачем создавать «кучу» в шмеме только ради того, чтобы её там создать и юзать шмем + сем?

deep-purple ★★★★★
()
Ответ на: комментарий от InterVi

Никакой разницы. Даже на пыхе то же самое — юзаешь шмем, изволь прибираться в той куче говна сам: имя сегмента, размер, права доступа. Нахрена оно тебе надо, если процесс у тебя всеравно один? Вот пусть тот же пых сам со своим GC и память-выделятором, совместно с осью разбираются сколько куда и чего выделить и очистить.

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