任务:替换为std::thread
逻辑上稍微相似(实际编写)的包装类 WinAPI 线程。
主要问题与 Thread 类的构造函数有关:它在逻辑上应该类似于 std::thread 类的构造函数。(类比参见 main() 函数)
/* ??? */
意味着我不知道需要在那里写什么才能使其工作。
#include <iostream>
#include <thread>
#include <functional>
#include <stdexcept>
#include <Windows.h>
// Класс-обертка "Поток"
class Thread {
public:
// Конструктор
template < typename _Callable, typename..._Args >
Thread(_Callable && callable, _Args && ...args) {
/* ??? */
thread_ = CreateThread(NULL, 0, /* ??? */, /* ??? */, 0, NULL);
if (thread_ == 0) {
throw std::system_error(errno, std::generic_category());
}
}
// Деструктор
~Thread() {
if (this->joinable()) {
TerminateThread(thread_, 0);
CloseHandle(thread_);
}
}
// Отделение потока выполнения от объекта потока, позволяя продолжить выполнение независимо
void detach() {
if (this->joinable()) {
if (!CloseHandle(thread_)) {
throw std::system_error();
}
thread_ = INVALID_HANDLE;
} else throw std::invalid_argument("joinable() == false!");
}
// Блокировка текущего потока до тех пор, пока поток, обозначенный *this, не завершит свое выполнение
void join() {
if (this->joinable()) {
if (WaitForSingleObject(thread_, INFINITE) != WAIT_OBJECT_0) {
throw std::system_error();
}
thread_ = INVALID_HANDLE;
} else throw std::invalid_argument("joinable() == false!");
}
// Проверяет, идентифицирует ли объект std :: thread активный поток выполнения
bool joinable() {
return thread_ != INVALID_HANDLE;
}
private:
// Идентификатор дескриптора потока
HANDLE thread_;
// [Константа] Неверный идентификатор дескриптора потока
static constexpr HANDLE INVALID_HANDLE = nullptr;
// Конструктор копирования запрещен
Thread(const Thread & ) = delete;
// Оператор копирования запрещен
Thread & operator = (const Thread & ) = delete;
};
// Некоторый класс SomeClass с некоторым методом someMethod,
// который нужно выполнить в отдельном потоке
class SomeClass {
public:
SomeClass(int a, int b): a_(a), b_(b) {}
void someMethod(int c, int d) {
// Некоторая работа...
std::cout << "Hello, world! " << (a_ += c) << ", " << (b_ += d) << '\n';
Sleep(1000);
}
private:
int a_, b_;
};
// Точка входа
int main() {
SomeClass some_object(1, 2);
std::thread std_thread( & SomeClass::someMethod, some_object, 1, 1);
Thread win_thread( & SomeClass::someMethod, some_object, 1, 1);
std_thread.join();
win_thread.join();
}
结果如下。
调用.h
主文件