线程池还没运行完毕 main函数就结束了

例子:本应该执行30次,结果执行了9次就结束了

#include <iostream>
#include <chrono>
#include "ThreadPool.hpp"
class Test
{
public:

	void fun1()

	{
		std::cout <<"No paras "<< "working in thread " << std::this_thread::get_id() << std::endl;
	}

	static void fun2()
	{
		std::cout << "No paras " << "working in thread " << std::this_thread::get_id() << std::endl;
	}
};


void fun(int i)
{
	std::mutex m_mutex;
	std::unique_lock<std::mutex> lock{ m_mutex };
	std::this_thread::sleep_for(std::chrono::milliseconds(4000));
	std::cout << "task " << i << " working in thread " << std::this_thread::get_id() << std::endl;
}

int main(int argc, char* argv[])
{
	ThreadPool threadPool(9);
	threadPool.start();
	std::this_thread::sleep_for(std::chrono::milliseconds(500));
	for(int i=0;i<30;i++)
	{
		threadPool.appendTask(std::bind(fun, i));
		//std::this_thread::sleep_for(std::chrono::milliseconds(500));
	}
	std::cout << "结束线程"<<std::endl;
	return 0;
}

在这里插入图片描述

解决办法:
方法一:在循环体中或是循环体外加入等待时间,此时总的等待时间必须是大于线程函数总的处理时间,不好控制

#include <iostream>
#include <chrono>
#include "ThreadPool.hpp"
class Test
{
public:

	void fun1()

	{
		std::cout <<"No paras "<< "working in thread " << std::this_thread::get_id() << std::endl;
	}

	static void fun2()
	{
		std::cout << "No paras " << "working in thread " << std::this_thread::get_id() << std::endl;
	}
};


void fun(int i)
{
	std::mutex m_mutex;
	std::unique_lock<std::mutex> lock{ m_mutex };
	std::this_thread::sleep_for(std::chrono::milliseconds(4000));
	std::cout << "task " << i << " working in thread " << std::this_thread::get_id() << std::endl;
}

int main(int argc, char* argv[])
{
	ThreadPool threadPool(9);
	threadPool.start();
	std::this_thread::sleep_for(std::chrono::milliseconds(500));
	for(int i=0;i<30;i++)
	{
		threadPool.appendTask(std::bind(fun, i));
		std::this_thread::sleep_for(std::chrono::milliseconds(500));
	}
	std::cout << "结束线程"<<std::endl;
	return 0;
}

方法二:在主函数的循环体外加入死循环,等待任务队列为空,此时也会出现在某一时刻任务队列为空,直接退出,所以需要加入双层循环进行判断。

#include <iostream>
#include <chrono>
#include "ThreadPool.hpp"
class Test
{
public:

	void fun1()

	{
		std::cout <<"No paras "<< "working in thread " << std::this_thread::get_id() << std::endl;
	}

	static void fun2()
	{
		std::cout << "No paras " << "working in thread " << std::this_thread::get_id() << std::endl;
	}
};


void fun(int i)
{
	std::mutex m_mutex;
	std::unique_lock<std::mutex> lock{ m_mutex };
	std::this_thread::sleep_for(std::chrono::milliseconds(4000));
	std::cout << "task " << i << " working in thread " << std::this_thread::get_id() << std::endl;
}

int main(int argc, char* argv[])
{
	ThreadPool threadPool(9);
	threadPool.start();
	std::this_thread::sleep_for(std::chrono::milliseconds(500));
	for(int i=0;i<30;i++)
	{
		threadPool.appendTask(std::bind(fun, i));
		std::this_thread::sleep_for(std::chrono::milliseconds(50));
	}
	
	std::this_thread::sleep_for(std::chrono::milliseconds(20));
	while (!threadPool.isEmpty())
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(50));//以防运行过快,直接跳过
		while (!threadPool.isEmpty())
			break;
	}

	std::cout << "结束线程"<<std::endl;
	return 0;
}

在这里插入图片描述
方法三:使用条件变量使线程同步