
Co-authored-by: tushicheng <18829573815@163.com> Co-authored-by: HaHaJeff <jeffzhouhhh@gmail.com> Co-authored-by: dimstars <liangjinrongcm@gmail.com>
125 lines
2.8 KiB
C++
125 lines
2.8 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#include <gtest/gtest.h>
|
|
#include "atomic"
|
|
#include "lib/thread/threads.h"
|
|
|
|
using namespace oceanbase::lib;
|
|
|
|
TEST(TestThreads, CanRun)
|
|
{
|
|
int val = 0;
|
|
|
|
val = 0;
|
|
class Thread: public Threads {
|
|
public:
|
|
Thread(int &val) : val_(val) {}
|
|
virtual void run(int64_t idx) override
|
|
{
|
|
val_++;
|
|
}
|
|
int &val_;
|
|
} th(val);
|
|
th.start();
|
|
th.wait();
|
|
ASSERT_EQ(1, val);
|
|
}
|
|
|
|
TEST(TestThreads, CanRunMulti)
|
|
{
|
|
static std::atomic<int64_t> val;
|
|
class Thread: public Threads
|
|
{
|
|
public:
|
|
Thread(std::atomic<int64_t>&val) : val_(val) {}
|
|
void run(int64_t idx) final
|
|
{
|
|
val += idx;
|
|
while (!ATOMIC_LOAD(&has_set_stop()))
|
|
;
|
|
}
|
|
std::atomic<int64_t> &val_;
|
|
} th(val);
|
|
|
|
val = 0;
|
|
th.set_thread_count(7);
|
|
th.start();
|
|
th.stop();
|
|
th.wait();
|
|
ASSERT_EQ(21, val); // 0+1+2+3+4+5+6
|
|
}
|
|
|
|
TEST(TestThreads, DynamicThread)
|
|
{
|
|
static std::atomic<int64_t> starts;
|
|
static std::atomic<int64_t> exits;
|
|
class: public Threads
|
|
{
|
|
std::atomic<int64_t> n_threads_;
|
|
public:
|
|
int set_thread_count(int64_t n_threads)
|
|
{
|
|
n_threads_ = n_threads;
|
|
return Threads::set_thread_count(n_threads);
|
|
}
|
|
void run(int64_t idx) final
|
|
{
|
|
starts++;
|
|
while (idx < n_threads_ && !has_set_stop())
|
|
;
|
|
exits++;
|
|
}
|
|
} th;
|
|
th.set_thread_count(1);
|
|
th.start();
|
|
while (starts != 1) { ::usleep(10); }
|
|
th.set_thread_count(2);
|
|
while (starts != 2) { ::usleep(10); }
|
|
th.set_thread_count(4);
|
|
while (starts != 4) { ::usleep(10); }
|
|
th.set_thread_count(1);
|
|
while (exits != 3) { ::usleep(10); }
|
|
th.submit([]{});
|
|
//ASSERT_EQ(1, th.get_cur_tasks());
|
|
th.stop();
|
|
th.wait();
|
|
ASSERT_EQ(4, starts);
|
|
ASSERT_EQ(4, exits);
|
|
}
|
|
extern "C" {
|
|
int ob_pthread_create(void **ptr, void *(*start_routine) (void *), void *arg);
|
|
void ob_pthread_join(void *ptr);
|
|
pthread_t ob_pthread_get_pth(void *ptr);
|
|
}
|
|
|
|
void *my_func(void *arg)
|
|
{
|
|
pthread_t *pth = (pthread_t*)arg;
|
|
*pth = pthread_self();
|
|
return NULL;
|
|
}
|
|
TEST(TestThreads, ObPthread)
|
|
{
|
|
pthread_t pth = 0;
|
|
void *tid = NULL;
|
|
ASSERT_EQ(0, ob_pthread_create(&tid, my_func, &pth));
|
|
sleep(1);
|
|
ASSERT_EQ(ob_pthread_get_pth(tid), pth);
|
|
ob_pthread_join(tid);
|
|
}
|
|
int main(int argc, char **argv)
|
|
{
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|