You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
64 lines
1.7 KiB
// This file is part of Eigen, a lightweight C++ template library |
|
// for linear algebra. |
|
// |
|
// Copyright (C) 2015 Vijay Vasudevan <vrv@google.com> |
|
// |
|
// 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 the mozilla.org home page |
|
|
|
#define EIGEN_USE_THREADS |
|
|
|
#include <atomic> |
|
|
|
#include <stdlib.h> |
|
#include "main.h" |
|
#include <Eigen/CXX11/Tensor> |
|
|
|
static void test_notification_single() |
|
{ |
|
ThreadPool thread_pool(1); |
|
|
|
std::atomic<int> 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<int> 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()); |
|
}
|
|
|