Ich bin ein Anfänger von C++ Multi Threading-Programm. Ich habe einen Dummy-Code für meine Frage erstellt. Hoge-Klasse ist Kommunikationsklasse, die Connected-Socket ist und ich nehme an, Hoge :: update() ist Datenempfangsklasse über den Socket. Und wenn bestimmte Daten angekommen sind, gibt die Hoge-Instanz die Daten zur spezifischen Verarbeitung an die Fuga-Instanz weiter.Wie vermeidet man das Blockieren von Threads während einer starken Verarbeitung in C++?
Also meine Fragen sind,
- Ich will nicht Hoge :: update() blockieren. Nach dem Speichern der Daten möchte ich daher th_process_data.join() nicht verwenden. Gibt es dafür eine bessere Lösung?
- Nach der Verarbeitung von Daten in einem anderen Thread, wie diese verarbeiteten Daten an Hoge-Instanz zurückgegeben werden. Eine Callback-Klasse ist eine Lösung?
Hoge.cc
Fuga fuga;
Hoge::update() {
while(true) {
if(check_something()) {
auto data = get_data();
fuga.push_data(data);
}
}
}
Hoge::on_received(const Data& data) {
std::cout << "received: " << data.id << std::endl;
// do something...
}
Fuga.cc
std::vector<Data> data_list;
std::mutex mtx;
Fuga::push_data(const Data& data) {
{
std::lock_guard<std::mutex> lock(mtx);
data_list.push_back(data);
}
std::thread th_process_data([&]{ do_processing(); });
// Q1. I don't want to block this thread for Hoge::update()
}
Fuga::do_processing() {
Data data;
{
std::lock_guard<std::mutex> lock(mtx);
data = data_list.pop();
}
// heavy task for data...
std::this_thread::sleep_for(std::chrono::seconds(3));
// Q2. How to pass this processed data to Hoge::on_received(const Data& data)
}