|
|
||
|---|---|---|
| include | ||
| msvc | ||
| src | ||
| test | ||
| .gitignore | ||
| CMakeLists.txt | ||
| Makefile | ||
| README.md | ||
| todo | ||
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;
}