漫话linux:手搓简易线程池(正式版)

1.Makefile

注意要使用c++11进行编译,所以文件名,g++格式都要进行变化

 以上为第一个头文件

第二个头文件

#include <iostream>
#include <vector>
#include <string>
#include <unistd.h>
#include <sys/wait.h>
#include <functional>
#include <cassert>
#include <cstdlib>
#include <ctime>
#include "store.hpp"
#include"task.hpp"
void slaver(std::vector<task_t>&tasks)
{
    while(1)
    {
        int cmd;
        int n=read(0,&cmd,sizeof(int));
        if(n==sizeof(int))
        {
            std::cout<<"slaver收到了一条命令,这是pid:"<<getpid()<<"收到的命令编号是:"<<cmd<<std::endl;
            if(cmd>=0&&cmd<tasks.size())
            {
                tasks[cmd]();
            }        
        }
        if(n==0)
        {
            break;
        }
    }
}
void initchi(std::vector<channel>*channels,std::vector<task_t>&tasks,int processnum)
{
    std::vector<int>oldfd;
    for(int i=0;i<processnum;i++)
    {
        int pipefd[2];
        int n=pipe(pipefd);
        pid_t newid=fork();
        if(newid==0)
        {
            std::cout<<"现在是子进程时间,它的pid是:"<<getpid()<<"现关闭历史进程运行此子进程"<<std::endl;
            for(auto &a:oldfd)
            {
                std::cout<<"关闭了"<<a<<std::endl;
                close(a);
            }
        
        std::cout<<"现对子进程进行操作,首先关闭写端"<<std::endl;
        close(pipefd[1]);
        std::cout<<"重定向子进程读端"<<std::endl;
        dup2(pipefd[0],0);
        std::cout<<"关闭子进程读端,准备执行任务"<<std::endl;
        close(pipefd[0]);
        slaver(tasks);
        exit(0);
        }
        else{
            std::cout<<"现在是父进程时间,准备创建子进程结构体"<<std::endl;
            std::string name="process-"+std::to_string(i);
            channels->push_back(channel(pipefd[1],newid ,name));
            oldfd.push_back(pipefd[1]);

        }
    }
}
void Menu() {
    std::cout << "################################################" << std::endl;
    std::cout << "# 1. 去步行街             2. 去桃园              #" << std::endl;
    std::cout << "# 3. 去小吃摊             4. 去荟园              #" << std::endl;
    std::cout << "#                        -2. 退出               #" << std::endl;
    std::cout << "#################################################" << std::endl;
}
void quitechannels(std::vector<channel>&channels)
{
    for(auto &c:channels)
    {
        close (c.fd);
        std::cout<<"关闭了一个子进程"<<std::endl;
        waitpid(c.id,nullptr,0);
        std::cout<<"进程等待回收,避免僵尸进程"<<std::endl;
    }
}
void ctrlslaver(std::vector<channel>&channels)
{
    int wh=0;
    while(1)
    {
        int select=0;
        Menu();
        std::cout<<"请输入";
        std::cin>>select;
        if(select<0||select>5)
        {
            std::cout<<"因输入错误或用户退出,线程池终止"<<std::endl;
        }
        int cmdcode=select-1;
        std::cout<<"任务进行中"<<std::endl;
         write(channels[wh].fd, &cmdcode, sizeof(cmdcode));
           wh++;
        wh %= channels.size();

    }
}
int main() {
    srand(time(nullptr) ^ getpid() ^ 1023);
 
    std::vector<task_t> tasks;
    loadtask(&tasks);
 
    int processnum = 4;
    std::vector<channel> channels;
    initchi(&channels, tasks, processnum);
 
    ctrlslaver(channels);
 
    quitechannels(channels);
 
    return 0;
}

 详细注释代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值