Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Использование статических методов в многопоточном приложении

#cpp #qt #многопоточность


Обращаюсь к более опытным товарищам. Имеется класс Class1, в нём есть статические
методы. Имеются N потоков (больше 1000), которые должны использовать статические методы
класса Class1.

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


Ответы

Ответ 1



Да, конечно, можно сделать мьютекс приватным членом класса. Если несколько потоков одновременно вызовут статический метод нашего класса, то каждый из них попытается захватить мьютекс, у одного это получится, остальные будут ждать пока этот поток выйдет из метода. #include #include #include #include class C { public: static void f() { std::lock_guard lock(static_mutex); // Критическая секция, например выведем идентификатор нашего потока std::cout << std::this_thread::get_id() << std::endl; } private: static std::mutex static_mutex; }; std::mutex C::static_mutex; int main() { std::vector threads; for (int i = 0; i < 10; ++i) threads.emplace_back([] { C::f(); }); for (std::thread &t : threads) t.join(); return 0; } Update: Заменил unique_lock на lock_guard и thread.detach() на thread.join(), как советуют в комментариях. А вообще, посмотрите другой ответ, там предложено более изящное решение.

Ответ 2



Проще всего сделать мьютекс локальным статическим объектом: void f() { static std::mutex local_mutex; std::unique_lock lock(local_mutex); // ... } Плюсы: Не нужно плодить переменные класса Применимо для любых функций/статических методов Минимум кода Минус: Нет защиты от одновременной инициализации многими потоками. Поэтому желательно первый вызов функции гарантировать без гонки потоков.

Комментариев нет:

Отправить комментарий