void flushingWork() { #if 0 std::vector< LoggerPtr > loggersList; loggersList.reserve(loggers.size()); mutex.lock_shared(); for (auto it = loggers.begin(); it != loggers.end(); ++it) { loggersList.push_back(it->second); } mutex.unlock_shared(); for (auto it = loggersList.begin(); it != loggersList.end(); ++it) { (*it)->flush(); } std::this_thread::yield(); #endif #if 1 mutex.lock_shared(); for (auto it = loggers.begin(); it != loggers.end(); ++it) { auto logger = it->second; logger->flush(); // flushing inside a CS may be not a good idea... } mutex.unlock_shared(); std::this_thread::yield(); #endif }
void f1() { time_point t0 = Clock::now(); assert(m.try_lock_shared_until(Clock::now() + WaitTime + Tolerance) == true); time_point t1 = Clock::now(); m.unlock_shared(); ns d = t1 - t0 - WaitTime; assert(d < Tolerance); // within 50ms }
void f1() { time_point t0 = Clock::now(); assert(m.try_lock_shared_for(ms(300)) == true); time_point t1 = Clock::now(); m.unlock_shared(); ns d = t1 - t0 - ms(250); assert(d < ms(50)); // within 50ms }
void g() { time_point t0 = Clock::now(); m.lock_shared(); time_point t1 = Clock::now(); m.unlock_shared(); ns d = t1 - t0; assert(d < Tolerance); // within tolerance }
void f() { time_point t0 = Clock::now(); assert(!m.try_lock_shared()); assert(!m.try_lock_shared()); assert(!m.try_lock_shared()); while(!m.try_lock_shared()) ; time_point t1 = Clock::now(); m.unlock_shared(); ns d = t1 - t0 - ms(250); assert(d < Tolerance); // within tolerance }
int main() { m.lock(); std::vector<std::thread> v; for (int i = 0; i < 5; ++i) v.push_back(std::thread(f)); std::this_thread::sleep_for(WaitTime); m.unlock(); for (auto& t : v) t.join(); m.lock_shared(); for (auto& t : v) t = std::thread(g); std::thread q(f); std::this_thread::sleep_for(WaitTime); m.unlock_shared(); for (auto& t : v) t.join(); q.join(); }
int main() { #if _LIBCPP_STD_VER > 11 m.lock(); std::vector<std::thread> v; for (int i = 0; i < 5; ++i) v.push_back(std::thread(f)); std::this_thread::sleep_for(ms(250)); m.unlock(); for (auto& t : v) t.join(); m.lock_shared(); for (auto& t : v) t = std::thread(g); std::thread q(f); std::this_thread::sleep_for(ms(250)); m.unlock_shared(); for (auto& t : v) t.join(); q.join(); #endif // _LIBCPP_STD_VER > 11 }