<add>新增linux下线程池简单的启动
This commit is contained in:
parent
c2c4009ee1
commit
24ecfe29a0
|
@ -1,3 +1,6 @@
|
||||||
/build
|
/build
|
||||||
|
/bin
|
||||||
*.so
|
*.so
|
||||||
*.exe
|
*.exe
|
||||||
|
/.vscode
|
||||||
|
/.cache
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
};
|
|
@ -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;
|
||||||
|
};
|
|
@ -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
|
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
enum class Loglevel {
|
||||||
|
OFF, DEBUG, INFO, WARN, ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename ...Args>
|
||||||
|
void log(Loglevel level, Args... arg) {
|
||||||
|
|
||||||
|
}
|
|
@ -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;
|
||||||
|
};
|
6
main.cpp
6
main.cpp
|
@ -1,6 +0,0 @@
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
std::cout << "hello ProcessPoll" << '\n';
|
|
||||||
return 0;
|
|
||||||
}
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 {
|
||||||
|
|
||||||
|
/* 父进程 */
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -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
|
||||||
|
)
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
#include "processpool.hpp"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
ProcessPool pool(3);
|
||||||
|
pool.exec();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue