Я пытаюсь реализовать этот пул потоков с классами в C ++. С тех пор я был уверен, что понимаю, как работают классы, но теперь я злюсь.
У меня есть 2 файла "JobScheduler.h" и "JobScheduler. cpp"
JobScheduler. h
class JobScheduler {
int thread_id;
std::vector<std::thread> pool;
std::mutex m1;
int set_id();
public:
JobScheduler();
~JobScheduler();
void Start();
};
JobScheduler. cpp
int id = 0;
std::mutex m;
JobScheduler::JobScheduler() {...}
JobScheduler::~JobScheduler() {...}
int JobScheduler::set_id() {
m1.lock();
int tmp_id = thread_id;
thread_id++;
std::cout << "id = " << tmp_id << "\n";
m1.unlock();
return tmp_id;;
}
int set_id_02(){
m.lock();
int tmp_id = id;
id++;
std::cout << "id = " << tmp_id << "\n";
m.unlock();
return tmp_id;
}
void JobScheduler::Start(){
// THIS DOESN'T WORK
/*
for(unsigned int i = 0; i < std::thread::hardware_concurrency(); i++){
pool.emplace_back(std::thread(std::packaged_task<void()>(JobScheduler::set_id))); // <--- error
}
... // print something and join threads
*/
// MANY THREADS - NO CLASS METHOD AS FUNCTION AND GLOBAL CPP VARIABLE - WORK
/*
for(unsigned int i = 0; i < std::thread::hardware_concurrency(); i++){
pool.emplace_back(std::thread(std::packaged_task<int()>(set_id_02)));
}
... // print something and join threads
*/
}
Теперь, если я использую функцию, определенную в. cpp, она работает нормально, но если я пытаюсь использовать функцию, определенную в класс не работает, но мне нужно иметь доступ к переменным класса.
Так что у меня много сомнений: 1) почему это не работает, что я делаю не так? 2) все в порядке, чтобы создать std :: package_task, как я делаю для? Или я должен сделать что-то вроде
std::pakaged_task<int()> main_task(set_id);
for(unsigned int i = 0; i < std::thread::hardware_concurrency(); i++){
pool.emplace_back(std::thread(main_task));
}
3) в обоих случаях, как я могу получить доступ к будущему задачи, которую я создал?