<add>新增linux下线程池简单的启动

This commit is contained in:
dyz 2025-01-24 23:34:05 +08:00
parent c2c4009ee1
commit 24ecfe29a0
14 changed files with 165 additions and 9 deletions

5
.gitignore vendored
View File

@ -1,3 +1,6 @@
/build /build
/bin
*.so *.so
*.exe *.exe
/.vscode
/.cache

View File

@ -1,8 +1,17 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
project(ProcessPool) project(ProcessPool)
set(CMAKE_CXX_STANDARD 11)
set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
add_library(${PROJECT_NAME} SHARED main.cpp) file(GLOB SRC src/*.cpp)
if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
file(GLOB OSRC src/systemapi/unix/*.cpp)
else()
file(GLOB OSRC src/systemapi/win/*.cpp)
endif()
add_library(${PROJECT_NAME} SHARED ${SRC} ${OSRC})
target_include_directories(${PROJECT_NAME} PUBLIC target_include_directories(${PROJECT_NAME} PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include

13
header/systempool.hpp Normal file
View File

@ -0,0 +1,13 @@
#pragma once
#include "processpool.hpp"
#include "worker.hpp"
#include <vector>
struct ProcessPool::systemapi {
/* 子工作进程 */
std::vector<Worker> works;
systemapi(int num);
void start(const Worker&) const;
};

12
header/worker.hpp Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include "exportapi.hpp"
class Worker {
/* 子进程的pid */
pid_t m_pid;
bool m_busy;
public:
void handle(pid_t pid) const;
};

30
include/exportapi.hpp Normal file
View File

@ -0,0 +1,30 @@
#pragma once
#if defined(_WIN32) || defined(_WIN64)
#ifdef DYZEXPORT
#define POOLAPI __declspec(dllexport)
#else
#define POOLAPI __declspec(dllimport)
#endif
#else
#define POOLAPI __attribute__((visibility("default")))
#endif
#if defined(_WIN32) || defined(_WIN64)
#else
#include "sys/types.h"
#include "unistd.h"
#endif
#if defined(_WIN32) || defined(_WIN64)
#else
using pid_t = pid_t;
#endif

10
include/log.hpp Normal file
View File

@ -0,0 +1,10 @@
#pragma once
enum class Loglevel {
OFF, DEBUG, INFO, WARN, ERROR
};
template <typename ...Args>
void log(Loglevel level, Args... arg) {
}

16
include/processpool.hpp Normal file
View File

@ -0,0 +1,16 @@
#pragma once
#include "exportapi.hpp"
#include <memory>
class POOLAPI ProcessPool {
/* 进程数量 */
int m_num;
struct systemapi;
std::shared_ptr<systemapi> Impl;
public:
ProcessPool(int num);
void exec() const;
};

View File

@ -1,6 +0,0 @@
#include <iostream>
int main() {
std::cout << "hello ProcessPoll" << '\n';
return 0;
}

17
src/processpool.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "processpool.hpp"
#include "systempool.hpp"
ProcessPool::ProcessPool(int num):m_num(num)
{
Impl = std::make_shared<systemapi>(m_num);
}
void ProcessPool::exec() const {
for (const auto& e : Impl->works)
{
/* 创建子工作进程 */
Impl->start(e);
}
}

View File

@ -0,0 +1,26 @@
#include "processpool.hpp"
#include "systempool.hpp"
ProcessPool::systemapi::systemapi(int num) {
for (int i = 0; i < num; ++i)
{
Worker work;
works.push_back(work);
}
}
/* 创建进程任务 */
void ProcessPool::systemapi::start(const Worker& child) const {
pid_t pid = fork();
if (pid > 0) {
child.handle(pid);
}
else if (pid < 0) {
/* 创建失败 */
}
else {
/* 父进程 */
}
}

View File

@ -0,0 +1 @@

12
src/worker.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "worker.hpp"
#include "iostream"
void Worker::handle(pid_t pid) const {
for (int i = 0; i < 5; ++i)
{
std::cerr << "子进程任务:" << pid << '\n';
sleep(1);
}
return;
}

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../bin)
# Add test executable # Add test executable
add_executable(${PROJECT_NAME}_test test.cpp) add_executable(${PROJECT_NAME}_test test.cpp)
@ -7,3 +7,7 @@ add_executable(${PROJECT_NAME}_test test.cpp)
target_link_libraries(${PROJECT_NAME}_test PRIVATE target_link_libraries(${PROJECT_NAME}_test PRIVATE
${PROJECT_NAME} ${PROJECT_NAME}
) )
target_include_directories(${PROJECT_NAME}_test PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/../include
)

View File

@ -0,0 +1,9 @@
#include "processpool.hpp"
int main() {
ProcessPool pool(3);
pool.exec();
return 0;
}