linux下的进程池(单类任务版)

ProcPoll.h

#ifndef TASKQUEUE_H
#define TASKQUEUE_H
#include "hoops_sc/StepTransformerX.h"


#include <functional>
#include <semaphore.h>
#include <cstdio>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <pthread.h>

#define PROCESS_NUM 4
#define SHM_SIZE 1024


class ProcPool {
   
public:
    // 获取单例实例的静态方法
    static ProcPool *getInstance() {
   
        // 静态局部变量,确保线程安全
        static ProcPool instance;
        return &instance;
    }

    void init();

    int distributeScTask(const std::string &msg);

    // 禁用拷贝构造函数和赋值运算符
    ProcPool(const ProcPool &) = delete;

    ProcPool &operator=(const ProcPool &) = delete;

    // 禁用移动构造函数和移动赋值运算符
    ProcPool(ProcPool &&) = delete;

    ProcPool &operator=(ProcPool &&) = delete;

    static std::map<pid_t, int[2]> procToPipeMap;

private:
    // private:
    static sem_t *sem;
    static sem_t *sem2;
    static sem_t *procMutex;
    static int *sharePid;
    static char *inputFileName;
    static char *scDirName;
    static int shm_fd[6];


    ProcPool();

    ~ProcPool();

    //必须设置成静态
    static void procFunc(void *userdata);

    static int initSem();

    int initProcs();

    //保证线程安全
    pthread_mutex_t mutex{
   };
};


#endif //TASKQUEUE_H

ProcPoll.cpp

#include "procPool.h"

#include <hv/hproc.h>

ProcPool::ProcPool() = default;

ProcPool::~ProcPool() {
   
    sem_destroy(<
要在Linux下使用C语言创建进程,可以按照以下步骤: 1. 创建进程结构体,用于存储进程相关信息,如进程大小、当前已有进程数、互斥锁等。 2. 在主进程中创建进程,即创建一定数量的子进程,将它们放入进程中。 3. 当有任务需要处理时,主进程进程中取出一个空闲进程,将任务分配给它处理。 4. 子进程在处理完任务后,将自己标记为空闲状态,然后等待下一次任务分配。 以下是一个简单的进程实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <pthread.h> #define MAX_PROCESS_NUM 10 #define MAX_TASK_NUM 100 typedef struct { pid_t pid; int is_busy; } Process; typedef struct { pthread_mutex_t lock; Process *process_list; int process_num; int task_num; } ProcessPool; int create_process_pool(int num, ProcessPool *pool); int destroy_process_pool(ProcessPool *pool); int process_task(ProcessPool *pool); int main() { ProcessPool pool; if (create_process_pool(MAX_PROCESS_NUM, &pool) == -1) { printf("Failed to create process pool.\n"); exit(1); } // 处理任务 for (int i = 0; i < MAX_TASK_NUM; i++) { process_task(&pool); } if (destroy_process_pool(&pool) == -1) { printf("Failed to destroy process pool.\n"); exit(1); } return 0; } int create_process_pool(int num, ProcessPool *pool) { pool->process_num = num; pool->process_list = malloc(num * sizeof(Process)); if (pool->process_list == NULL) { return -1; } // 初始化互斥锁 pthread_mutex_init(&pool->lock, NULL); // 创建子进程 for (int i = 0; i < num; i++) { pid_t pid = fork(); if (pid == -1) { return -1; } else if (pid == 0) { // 子进程 while (1) { // 等待任务 pthread_mutex_lock(&pool->lock); for (int j = 0; j < pool->process_num; j++) { if (pool->process_list[j].pid == getpid()) { pool->process_list[j].is_busy = 0; break; } } pool->task_num--; pthread_mutex_unlock(&pool->lock); // 处理任务 printf("Process %d is processing task %d.\n", getpid(), MAX_TASK_NUM - pool->task_num); sleep(1); // 标记为空闲状态 pthread_mutex_lock(&pool->lock); for (int j = 0; j < pool->process_num; j++) { if (pool->process_list[j].pid == getpid()) { pool->process_list[j].is_busy = 0; break; } } pthread_mutex_unlock(&pool->lock); } } else { // 父进程 pool->process_list[i].pid = pid; pool->process_list[i].is_busy = 0; } } // 初始化任务数 pool->task_num = MAX_TASK_NUM; return 0; } int destroy_process_pool(ProcessPool *pool) { // 等待子进程退出 for (int i = 0; i < pool->process_num; i++) { waitpid(pool->process_list[i].pid, NULL, 0); } // 释放资源 free(pool->process_list); pthread_mutex_destroy(&pool->lock); return 0; } int process_task(ProcessPool *pool) { // 找出空闲进程 int index = -1; pthread_mutex_lock(&pool->lock); for (int i = 0; i < pool->process_num; i++) { if (!pool->process_list[i].is_busy) { pool->process_list[i].is_busy = 1; index = i; break; } } pthread_mutex_unlock(&pool->lock); if (index == -1) { // 进程已满,等待空闲进程 sleep(1); process_task(pool); } else { // 分配任务 printf("Task %d is assigned to process %d.\n", MAX_TASK_NUM - pool->task_num, pool->process_list[index].pid); pool->task_num--; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值