Browse Source

update: cpp demo file structure

master
Dnomd343 1 year ago
parent
commit
e4b908f7ea
  1. 12
      CMakeLists.txt
  2. 10
      demo/cpp/CMakeLists.txt
  3. 8
      demo/cpp/demo.cc
  4. 0
      demo/demo.c
  5. 8
      src/CMakeLists.txt
  6. 8
      tiny_pool.c
  7. 7
      tiny_pool.h

12
CMakeLists.txt

@ -1,12 +1,10 @@
cmake_minimum_required(VERSION 3.0) cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11) set(CMAKE_C_STANDARD 99)
project(tiny_thread_demo LANGUAGES CXX) project(tiny_thread_pool LANGUAGES C)
include_directories(src) add_library(tiny_pool tiny_pool.c)
target_link_libraries(tiny_pool pthread)
add_subdirectory(src) add_subdirectory(demo/cpp)
add_executable(demo demo.cc)
target_link_libraries(demo tiny_pool)

10
demo/cpp/CMakeLists.txt

@ -0,0 +1,10 @@
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)
project(tiny_pool_demo_cpp LANGUAGES CXX)
include_directories(../..)
add_executable(demo_cpp demo.cc)
target_link_libraries(demo_cpp tiny_pool)

8
demo.cc → demo/cpp/demo.cc

@ -20,7 +20,6 @@ public:
auto submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))>; auto submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))>;
}; };
template <typename Func, typename ...Args> template <typename Func, typename ...Args>
auto TinyPool::submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))> { auto TinyPool::submit(Func &&func, Args &&...args) -> std::future<decltype(func(args...))> {
std::function<decltype(func(args...))()> wrap_func = std::bind( std::function<decltype(func(args...))()> wrap_func = std::bind(
@ -37,7 +36,7 @@ auto TinyPool::submit(Func &&func, Args &&...args) -> std::future<decltype(func(
return func_ptr->get_future(); return func_ptr->get_future();
} }
/// -------------------------------- start test -------------------------------- /// ------------------------------------ start test ------------------------------------
#include <iostream> #include <iostream>
#include <unistd.h> #include <unistd.h>
@ -53,8 +52,6 @@ int test_func(char c) {
} }
int main() { int main() {
std::cout << "tiny thread pool demo start" << std::endl;
auto pool = TinyPool(3); auto pool = TinyPool(3);
auto f0 = pool.submit(test_func, '0'); auto f0 = pool.submit(test_func, '0');
@ -86,7 +83,4 @@ int main() {
printf("get future: %d\n", f1.get()); printf("get future: %d\n", f1.get());
printf("get future: %d\n", f9.get()); printf("get future: %d\n", f9.get());
printf("get future: %d\n", f7.get()); printf("get future: %d\n", f7.get());
std::cout << "tiny thread pool demo exit" << std::endl;
return 0;
} }

0
main.c → demo/demo.c

8
src/CMakeLists.txt

@ -1,8 +0,0 @@
cmake_minimum_required(VERSION 3.0)
set(CMAKE_C_STANDARD 99)
project(tiny_thread_pool LANGUAGES C)
add_library(tiny_pool tiny_pool.c)
target_link_libraries(tiny_pool pthread)

8
src/tiny_pool.c → tiny_pool.c

@ -9,11 +9,11 @@ void* run_pool_join(void *pool) { // single function for detach
void tiny_pool_detach(pool_t *pool) { void tiny_pool_detach(pool_t *pool) {
pthread_t tid; pthread_t tid;
pthread_create(&tid, NULL, run_pool_join, (void*)pool); pthread_create(&tid, NULL, run_pool_join, (void*)pool); // new thread for detach
pthread_detach(tid); pthread_detach(tid);
} }
void free_tiny_pool(pool_t *pool) { void free_tiny_pool(pool_t *pool) { // free memory and destroy thread pool
pthread_cond_destroy(&pool->without_busy_thread); pthread_cond_destroy(&pool->without_busy_thread);
pthread_cond_destroy(&pool->task_queue_not_empty); pthread_cond_destroy(&pool->task_queue_not_empty);
pthread_cond_destroy(&pool->task_queue_empty); pthread_cond_destroy(&pool->task_queue_empty);
@ -23,9 +23,9 @@ void free_tiny_pool(pool_t *pool) {
} }
void tiny_pool_kill(pool_t *pool) { void tiny_pool_kill(pool_t *pool) {
if (pool->status > PREPARING) { if (pool->status > PREPARING) { // threads are running
for (uint32_t i = 0; i < pool->thread_num; ++i) { for (uint32_t i = 0; i < pool->thread_num; ++i) {
pthread_cancel(pool->threads[i]); pthread_cancel(pool->threads[i]); // kill sub threads
} }
} }
free_tiny_pool(pool); // release thread pool free_tiny_pool(pool); // release thread pool

7
src/tiny_pool.h → tiny_pool.h

@ -10,7 +10,7 @@
#include <cstdbool> #include <cstdbool>
#endif #endif
/// This is a lightweight thread pool designed for linux. It is implemented in C language. Its /// This is a lightweight thread pool designed for Linux, it is implemented in C language. Its
/// goal is to provide simple and stable services, so it does not provide functions such as priority /// goal is to provide simple and stable services, so it does not provide functions such as priority
/// and dynamic adjustment of the number of threads, and only provides the simplest threads pool /// and dynamic adjustment of the number of threads, and only provides the simplest threads pool
/// implementation. /// implementation.
@ -33,6 +33,9 @@
/// complete their tasks, the thread pool will be destroyed. /// complete their tasks, the thread pool will be destroyed.
/// ///
/// These four life cycles must proceed sequentially: PREPARING -> RUNNING -> STOPPING -> EXITING /// These four life cycles must proceed sequentially: PREPARING -> RUNNING -> STOPPING -> EXITING
///
/// NOTE: The STOPPING and EXITING states are automatically managed by the thread pool, and users
/// do not need to care about them.
/// When using it, you need to use `tiny_pool_create` to create a thread pool first, and then use /// When using it, you need to use `tiny_pool_create` to create a thread pool first, and then use
/// the `tiny_pool_submit` function to submit tasks to it. After the preparation is completed, use /// the `tiny_pool_submit` function to submit tasks to it. After the preparation is completed, use
@ -60,7 +63,7 @@ enum pool_stage {
typedef struct task_t { typedef struct task_t {
void (*entry)(void*); // function pointer of the task void (*entry)(void*); // function pointer of the task
void *arg; // argument of task function void *arg; // argument of task function
struct task_t *next; // the next task in the queue struct task_t *next; // next task in the queue
} task_t; } task_t;
typedef struct pool_t { typedef struct pool_t {
Loading…
Cancel
Save