§ 11. Создание процессов в Linux

Задания

  1. Создайте класс, который представляет собой поток. Класс должен работать аналогично std::thread. Возможность передавать аргументы вызываемой внутри потока функции как аргументы конструктора std::thread реализовывать необязательно:
    std::thread([] (int a, int b) {...}, a, b); // это необязательно
    std::thread([a,b]() {...});
    
    Для реализации воспользуйтесь следующими системными вызовами: В классе должны работать, по крайней мере, следующие методы:
    • конструктор,
    • деструктор,
    • оператор присваивания с перемещением,
    • метод join,
    • метод joinable,
    • метод get_id,
    • метод swap.
    Правильные опции системного вызова clone(2) есть в презентации. Для принудительного завершения потока используйте сигнал SIGTERM. Список всех сигналов есть в руководстве signal(7). Оригинальные страницы руководства на английском языке есть на сайте man7.org. Выходное значение всех системных вызовов нужно проверять с помощью функции check из презентации.
  2. Проверьте корректность работы класса, заменив std::thread в следующем фрагменте кода на ваш класс. Получившийся код поместите в модульный тест.
    std::atomic<unsigned long> counter{0};
    std::vector<std::thread> threads;
    for (int i=0; i<10; ++i) {
        threads.emplace_back([&counter] () { ++counter; });
    }
    for (auto& t : threads) { if (t.joinable()) { t.join(); } }
    unsigned long value = counter;
    EXPECT_EQ(10, value);