Go to file
2014-11-17 23:57:03 +03:00
include Добавил два варианта add_task с параметрами как у std::bind 2014-09-16 13:09:16 +04:00
msvc Добавлен базовый вариант пула потоков 2014-09-14 09:03:40 +04:00
src Адаптировал ассемблерный код для OS X. Добавил простой эхо сервер на boost.asio 2014-11-07 23:09:54 +03:00
test Небольшая чистка кода 2014-11-17 23:57:03 +03:00
.gitignore Добавил каталог .idea (служебные файлы CLion) в gitignore 2014-09-20 20:46:21 +04:00
CMakeLists.txt Добавлена базовая поддержка ассемблера (NASM), пока проверено только на linux. ассеьблерный код переделан с FASM на NASM 2014-09-21 21:37:07 +04:00
Makefile Добавил два варианта add_task с параметрами как у std::bind 2014-09-16 13:09:16 +04:00
README.md Update README.md 2014-09-16 23:16:58 +04:00
todo Убрал булевский флаг 2014-08-23 23:32:17 +04:00

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 потоками

threadpool pool(4);

Добавим задачу в виде глобальной функции с параметрами

int add(int x, int y)
{
    return x + y;
}

pool.add_task(&add, 1, 2);

или член класса

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!"));

можно добавить стандартный функтор или лябду (в последнем случае потребуется явно указать тип возаращаемого значения)

std::function<void()> func = []{ std::cout << "Hello world!" << std::endl; };
pool.add_task(func);

pool.add_task<int>([]{ return 42; });

Все варианты add_task возвращают std::future, что позволяет дождаться окончания выполнения задач и получить резульаты (а заодно гарантирует проброс исключений изнутри задач)

threadpool pool(4);
std::vector<std::future<int>> vec;

for (std::size_t i = 0; i < 100; ++i)
{
    std::future<int> fut = pool.add_task<int>([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;
}