2021-09-06 06:54:24 +00:00
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
|
|
#include <EC/ThreadPool.hpp>
|
|
|
|
|
2021-09-07 02:46:38 +00:00
|
|
|
using OneThreadPool = EC::ThreadPool<1>;
|
2021-09-06 06:54:24 +00:00
|
|
|
using ThreeThreadPool = EC::ThreadPool<3>;
|
|
|
|
|
2021-09-08 01:49:32 +00:00
|
|
|
TEST(ECThreadPool, OneThread) {
|
2021-09-07 02:46:38 +00:00
|
|
|
OneThreadPool p;
|
|
|
|
std::atomic_int data;
|
|
|
|
data.store(0);
|
|
|
|
const auto fn = [](void *ud) {
|
|
|
|
auto *data = static_cast<std::atomic_int*>(ud);
|
|
|
|
data->fetch_add(1);
|
|
|
|
};
|
|
|
|
|
|
|
|
p.queueFn(fn, &data);
|
|
|
|
|
|
|
|
p.wakeThreads();
|
|
|
|
|
|
|
|
do {
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
2021-09-08 01:46:26 +00:00
|
|
|
} while(!p.isQueueEmpty() || !p.isAllThreadsWaiting());
|
2021-09-07 02:46:38 +00:00
|
|
|
|
|
|
|
ASSERT_EQ(data.load(), 1);
|
|
|
|
|
|
|
|
for(unsigned int i = 0; i < 10; ++i) {
|
|
|
|
p.queueFn(fn, &data);
|
|
|
|
}
|
|
|
|
p.wakeThreads();
|
|
|
|
|
|
|
|
do {
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
2021-09-08 01:46:26 +00:00
|
|
|
} while(!p.isQueueEmpty() || !p.isAllThreadsWaiting());
|
2021-09-07 02:46:38 +00:00
|
|
|
|
|
|
|
ASSERT_EQ(data.load(), 11);
|
|
|
|
}
|
2021-09-06 06:54:24 +00:00
|
|
|
|
|
|
|
TEST(ECThreadPool, Simple) {
|
2021-09-07 02:46:38 +00:00
|
|
|
ThreeThreadPool p;
|
2021-09-06 06:54:24 +00:00
|
|
|
std::atomic_int data;
|
|
|
|
data.store(0);
|
|
|
|
const auto fn = [](void *ud) {
|
|
|
|
auto *data = static_cast<std::atomic_int*>(ud);
|
|
|
|
data->fetch_add(1);
|
|
|
|
};
|
|
|
|
|
|
|
|
p.queueFn(fn, &data);
|
|
|
|
|
|
|
|
p.wakeThreads();
|
|
|
|
|
2021-09-06 11:57:13 +00:00
|
|
|
do {
|
2021-09-06 06:54:24 +00:00
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
2021-09-08 01:46:26 +00:00
|
|
|
} while(!p.isQueueEmpty() || !p.isAllThreadsWaiting());
|
2021-09-06 06:54:24 +00:00
|
|
|
|
|
|
|
ASSERT_EQ(data.load(), 1);
|
|
|
|
|
|
|
|
for(unsigned int i = 0; i < 10; ++i) {
|
|
|
|
p.queueFn(fn, &data);
|
|
|
|
}
|
|
|
|
p.wakeThreads();
|
|
|
|
|
2021-09-06 11:57:13 +00:00
|
|
|
do {
|
2021-09-06 06:54:24 +00:00
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
2021-09-08 01:46:26 +00:00
|
|
|
} while(!p.isQueueEmpty() || !p.isAllThreadsWaiting());
|
2021-09-06 06:54:24 +00:00
|
|
|
|
|
|
|
ASSERT_EQ(data.load(), 11);
|
|
|
|
}
|
2021-09-07 11:21:20 +00:00
|
|
|
|
|
|
|
TEST(ECThreadPool, QueryCount) {
|
|
|
|
{
|
|
|
|
OneThreadPool oneP;
|
|
|
|
ASSERT_EQ(1, oneP.getThreadCount());
|
|
|
|
}
|
|
|
|
{
|
|
|
|
ThreeThreadPool threeP;
|
|
|
|
ASSERT_EQ(3, threeP.getThreadCount());
|
|
|
|
}
|
|
|
|
}
|
2021-09-09 06:53:55 +00:00
|
|
|
|
|
|
|
TEST(ECThreadPool, easyWakeAndWait) {
|
|
|
|
std::atomic_int data;
|
|
|
|
data.store(0);
|
|
|
|
{
|
|
|
|
OneThreadPool oneP;
|
|
|
|
for(unsigned int i = 0; i < 20; ++i) {
|
|
|
|
oneP.queueFn([] (void *ud) {
|
|
|
|
auto *atomicInt = static_cast<std::atomic_int*>(ud);
|
|
|
|
atomicInt->fetch_add(1);
|
|
|
|
}, &data);
|
|
|
|
}
|
|
|
|
oneP.easyWakeAndWait();
|
|
|
|
EXPECT_EQ(20, data.load());
|
|
|
|
}
|
|
|
|
{
|
|
|
|
ThreeThreadPool threeP;
|
|
|
|
for(unsigned int i = 0; i < 20; ++i) {
|
|
|
|
threeP.queueFn([] (void *ud) {
|
|
|
|
auto *atomicInt = static_cast<std::atomic_int*>(ud);
|
|
|
|
atomicInt->fetch_add(1);
|
|
|
|
}, &data);
|
|
|
|
}
|
|
|
|
threeP.easyWakeAndWait();
|
|
|
|
EXPECT_EQ(40, data.load());
|
|
|
|
}
|
|
|
|
}
|