int main() { Barrier barrier1(3); Barrier barrier2(3); arrived_all = false; processed_all = true; arrived_count.store(0); processed_count.store(allowed_max); std::thread worker[50]; for (int i = 0; i < 6; i++) worker[i] = std::thread(worker_thread, i, &barrier1, &barrier2); { std::lock_guard<std::mutex> lk(m); std::cout << "Back in main(), after initialing first thread batch " << data << std::endl; } // wait until worker dies finishes execution for (int i = 0; i < 6; i++) worker[i].join(); // for (int i = 5; i < 10; i++) // worker[i] = std::thread(worker_thread, i); // { // std::lock_guard<std::mutex> lk(m); // std::cout << "Back in main(), after initialing second thread batch." << std::endl; // } // // wait until worker dies finishes execution // for (int i = 5; i < 10; i++) // worker[i].join(); std::cout << "finished main(), data = " << data << std::endl; }
void PresetTests::parallelAccessTest() { const int initIterations = 100; const int itemsToGenerate = 5; DECLARE_MODELS_AND_GENERATE(itemsToGenerate); QString presetName = "preset"; QStringList keywords; keywords << "keyword1" << "another keyword" << "test"; Helpers::Barrier barrier1(2), barrier2(2); bool isAdded1, isAdded2; volatile bool removed1; volatile bool removed2; KeywordsPresets::ID_t id1 = 0; KeywordsPresets::ID_t id2 = 0; std::thread thread1([&]() { int n = initIterations; while (n--) { isAdded1 = false; id1 = 0; presetKeywordsModel.addOrUpdatePreset(presetName, keywords, id1, isAdded1); /*-------------*/barrier1.wait(); Q_ASSERT(isAdded1 != isAdded2); Q_ASSERT(id1 == id2); removed1 = presetKeywordsModel.removePresetByID(id1); /*-------------*/barrier2.wait(); Q_ASSERT(removed1 != removed2); } }); std::thread thread2([&]() { int n = initIterations; while (n--) { isAdded2 = false; id2 = 1; presetKeywordsModel.addOrUpdatePreset(presetName, keywords, id2, isAdded2); /*-------------*/barrier1.wait(); Q_ASSERT(isAdded1 != isAdded2); Q_ASSERT(id1 == id2); removed2 = presetKeywordsModel.removePresetByID(id2); /*-------------*/barrier2.wait(); Q_ASSERT(removed1 != removed2); } }); thread1.join(); thread2.join(); }