М
Миша15 листопада 2017 р. 09:03

Многопоточность

QThread

Здравствуйте.

Одна из функций обрабатывает массивы и постоянно изменяет переменные, записанные в хедере. Переменные изменяются другими функциями. В хедере записано, т.к. к этим переменным постоянно обращаются различные функции.
Обработка массивов требует большой вычислительной мощности, потому нужно сделать многопоточность.
Если сделать многопоточность в данной функции, то разные потоки будут обращаться к недочитанным переменным в хедер и результаты расчетов будут ошибочными.
Скажите пожалуйста, как логичней подойти к вопросу многопоточности?
Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

4
Evgenii Legotckoi
  • 15 листопада 2017 р. 09:19

День добрый!

Для этого можно использовать мюьтексы, они не дадут работать с данными, пока не отработает метод в потоке.
Сам мьютекс объявить в стеке классе.
class SomeClass : public QObject
{
public:
    void someMethod();

private:
    QMutex m_mutex;
};
А потом использовать его в начале метода, который работает в потоке с помощью QMutexLocker
void someMethod()
{
    QMutexLocker(&m_mutex);

    ...
}
Мьютекс не позволит обращаться к данным из других потоков, пока не закончится работа.
    М
    • 15 листопада 2017 р. 10:00

    Но в таком случае пропадет смысл многопоточности. Многопоточность нужна для одновременной обработки массивов. Для этого нужны переменные, записанные в хедере.

    Видимо нужно создавать в функции дублеры переменных, записанных в хедере.
    Я могу сделать функцию getParametr(), возвращающих одновременно переменные а1,а2,а3 не в хедер, а в функцию. Скажите пожалуйста, как принять одновременно а1,а2,а3 в функцию? Как правильно создать объект?
      М
      • 15 листопада 2017 р. 10:10

      Может быть есть способ сохранять для каждого потока свои переменные в хедере?

        Evgenii Legotckoi
        • 15 листопада 2017 р. 10:15
        • (відредаговано)

        Одновременно с одной переменной может работать только один поток. Если речь не идёт о записи данных в переменную, а только о доступе к ней, то ничего страшного не произойдёт, проблемы будут возникать при конкурентном доступе в разделяемому ресурсу (переменной) с целью его изменения. Если у вас существует только один экземпляр переменной, то бредовой будет идея делать несколько функций для каждого потока, которая возвратит одну и ту же переменную. Чтобы вы ни говорили о том, что идея многопоточности теряется, в данном случае вы не правы. Если у вас всего одна единственная переменная или массив, то не в коем случае нельзя давать возможность другим потокам работать с переменной, если один поток уже с ней работает.


        Вот если Вы в отдельные потоки вынесете обработку логики перед записью итоговых данных. Вот это уже другой вопрос. То есть делаете подготовку данных, а запись уже ведёте с использованием мюьтекса.

          Коментарі

          Only authorized users can post comments.
          Please, Log in or Sign up
          AD

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:50бали,
          • Рейтинг балів-4
          m
          • molni99
          • 26 жовтня 2024 р. 11:37

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:80бали,
          • Рейтинг балів4
          m
          • molni99
          • 26 жовтня 2024 р. 11:29

          C++ - Тест 004. Указатели, Массивы и Циклы

          • Результат:20бали,
          • Рейтинг балів-10
          Останні коментарі
          ИМ
          Игорь Максимов22 листопада 2024 р. 22:51
          Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
          Evgenii Legotckoi
          Evgenii Legotckoi01 листопада 2024 р. 00:37
          Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
          A
          ALO1ZE19 жовтня 2024 р. 18:19
          Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
          ИМ
          Игорь Максимов05 жовтня 2024 р. 17:51
          Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
          d
          dblas505 липня 2024 р. 21:02
          QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
          Тепер обговоріть на форумі
          Evgenii Legotckoi
          Evgenii Legotckoi25 червня 2024 р. 01:11
          добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
          t
          tonypeachey115 листопада 2024 р. 17:04
          google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
          NSProject
          NSProject04 червня 2022 р. 13:49
          Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
          9
          9Anonim25 жовтня 2024 р. 19:10
          Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

          Слідкуйте за нами в соціальних мережах