Only lock once per iteration

This commit is contained in:
eriedaberrie 2024-01-08 21:56:16 -08:00
parent d218af9c4a
commit f51e37e8c6

View file

@ -182,19 +182,13 @@ int main(int argc, char *argv[]) {
std::cout << "Starting " << wc << " worker threads..." << std::endl; std::cout << "Starting " << wc << " worker threads..." << std::endl;
for (unsigned int w = 1; w <= wc; w++) { for (unsigned int w = 1; w <= wc; w++) {
workers.push_back(std::thread([&it, &n_done, &it_lock, &all_fires, workers.push_back(std::thread([&it, &n_done, &it_lock, &all_fires,
&residentials, &out_dir, w, distance]() { &residentials, &out_dir, w, distance]() {
for (;;) { it_lock.lock();
it_lock.lock();
if (it == all_fires.end()) {
std::cout << "Worker " << w << " done! (finished " << n_done
<< "/" << all_fires.size() << ")" << std::endl;
it_lock.unlock();
return;
}
while (it != all_fires.end()) {
const auto& month_data = *(it++); const auto& month_data = *(it++);
auto& month = month_data.name; const auto& month = month_data.name;
auto& month_fires = month_data.days; const auto& month_fires = month_data.days;
std::cout << "Worker " << w << " processing data from " << month std::cout << "Worker " << w << " processing data from " << month
<< "... (finished " << n_done << "/" << "... (finished " << n_done << "/"
<< all_fires.size() << ")" << std::endl; << all_fires.size() << ")" << std::endl;
@ -225,12 +219,13 @@ int main(int argc, char *argv[]) {
outf << '\n'; outf << '\n';
} }
{ it_lock.lock();
std::lock_guard<std::mutex> lk(it_lock); n_done++;
n_done++;
}
} }
std::cout << "Worker " << w << " done! (finished " << n_done
<< "/" << all_fires.size() << ")" << std::endl;
it_lock.unlock();
})); }));
} }