0
点赞
收藏
分享

微信扫一扫

C++11简易线程池

minute_5 2023-03-16 阅读 82

#include<iostream>

#include<functional>

#include<thread>

#include<condition_variable>

#include<mutex>

#include<queue>

#define ThreadNum 555

#define POOL P

using namespace std;

void func(int);

class P

{

public:

P()

{

isRunning = true;

for (int i = 0; i<ThreadNum; i++)

{

threads.emplace([this,i]()

{

std::cout << i << std::endl;

while (isRunning)

{

std::unique_lock<std::mutex>lk(mtx);

cv.wait(lk, [this](){return isRunning && !tasks.empty(); });

Task nowTask =std::move(tasks.front());

tasks.pop();

nowTask();

}



; });

}

}

~P()

{

while (!threads.empty())

{

std::thread t = std::move(threads.front());

if (t.joinable())

{

t.join();

};

}

}

void commit(int id)

{

Task newtask = std::bind(func,id);

std::lock_guard < std::mutex>lk(mtx);

tasks.emplace(newtask);

cv.notify_one();

}

void stop()

{

std::unique_lock<std::mutex>lk(mtx);

isRunning = false;

}



private:

std::mutex mtx;

std::condition_variable cv;

using Task = std::function<void(void)>;

using WorkThread = std::thread;

std::queue<Task>tasks;

bool isRunning;

std::queue<WorkThread>threads;



};

void func(int id)

{



printf("%d\n", id);

}



int main()

{

POOL p;

for (int i = 0; i < 10; i++)

{

p.commit(i);

}

//cin.get();



}

举报

相关推荐

0 条评论