From 179a05210e33abda3d0027c3633966d2bbfac42b Mon Sep 17 00:00:00 2001 From: green-caterpillar Date: Tue, 16 Sep 2014 23:12:55 +0400 Subject: [PATCH] Update README.md --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/README.md b/README.md index 4a6361a..629c3bc 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,60 @@ cpputil * **ustring** - класс строки с внутренним представлением в UCS-4 и возможностью кодирования/декодирования UTF-8, UTF-16 и UTF-32 (little endian и big endian). Также распознает/вставляет BOM и экранированные USC-2 (\uXXXX) и USC-4 (\UXXXXXXXX) символы * **logger** - класс логирования. Нацелен на максимальное быстродействие (непосредственно запись в лог происходит в отдельном потоке) * **threadpool** - простой пул потоков, позволяет удобно добавлять задачи в пул и получать результаты + +## Примеры кода + +#### threadpool + +Создадим пул с 4 потоками +```C++ +threadpool pool(4); +``` +Добавим задачу в виде глобальной функции с параметрами +```C++ +int add(int x, int y) +{ + return x + y; +} + +pool.add_task(&add, 1, 2); +``` +или член класса +```cpp +class foo +{ +public: + void bar(std::string str) + { + std::cout << str << std::endl; + } +}; + +foo f; +// тип параметров должен точно совпадать, т.е. нельзя напсать просто "hello world!" +// потому что это const char*, а не std::string +pool.add_task(&foo::bar, &f, std::string("hello world!")); +``` +можно добавить стандартный функтор или лябду (в последнем случае потребуется явно указать тип возаращаемого значения) +```cpp +std::function func = []{ std::cout << "Hello world!" << std::endl; }; +pool.add_task(func); + +pool.add_task([]{ return 42; }); +``` +Все варианты **add_task** возвращают **std::future**, что позволяет дождаться окончания выполнения задач и получить резульаты (а заодно гарантирует проброс исключений изнутри задач) +```cpp +threadpool pool(4); +std::vector> vec; + +for (std::size_t i = 0; i < 100; ++i) +{ + std::future fut = pool.add_task([i] { return i; }); + vec.push_back(std::move(fut)); +} + +for(std::size_t i = 0; i < 100; ++i) +{ + std::cout << "res[" << i << "] = " << vec[i].get() << std::endl; +} +```