Страницы

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

четверг, 1 ноября 2018 г.

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

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


Ответ

Да, конечно, можно сделать мьютекс приватным членом класса. Если несколько потоков одновременно вызовут статический метод нашего класса, то каждый из них попытается захватить мьютекс, у одного это получится, остальные будут ждать пока этот поток выйдет из метода.
#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(), как советуют в комментариях. А вообще, посмотрите другой ответ, там предложено более изящное решение.

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

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