// This file is part of Eigen, a lightweight C++ template library // for linear algebra. // // Copyright (C) 2015 Vijay Vasudevan // // This Source Code Form is subject to the terms of the Mozilla // Public License v. 2.0. If a copy of the MPL was not distributed // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. #define EIGEN_USE_THREADS #include #include #include "main.h" #include static void test_notification_single() { ThreadPool thread_pool(1); std::atomic counter(0); Eigen::Notification n; auto func = [&n, &counter](){ n.Wait(); ++counter;}; thread_pool.Schedule(func); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // The thread should be waiting for the notification. VERIFY_IS_EQUAL(counter, 0); // Unblock the thread n.Notify(); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); // Verify the counter has been incremented VERIFY_IS_EQUAL(counter, 1); } // Like test_notification_single() but enqueues multiple threads to // validate that all threads get notified by Notify(). static void test_notification_multiple() { ThreadPool thread_pool(1); std::atomic counter(0); Eigen::Notification n; auto func = [&n, &counter](){ n.Wait(); ++counter;}; thread_pool.Schedule(func); thread_pool.Schedule(func); thread_pool.Schedule(func); thread_pool.Schedule(func); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); VERIFY_IS_EQUAL(counter, 0); n.Notify(); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); VERIFY_IS_EQUAL(counter, 4); } EIGEN_DECLARE_TEST(cxx11_tensor_notification) { CALL_SUBTEST(test_notification_single()); CALL_SUBTEST(test_notification_multiple()); }