例子:本应该执行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;
}
方法三:使用条件变量使线程同步