#include <iostream>
#include <windows.h>
#include <vector>
using namespace std;
class ThreadPool
{
public:
virtual bool StartThread(int threadCount)
{
bool ret = true;
for (int i = 0; i < threadCount; ++i)
{
m_threadRun = true;
HANDLE handle = CreateThread(NULL, 0, ThreadFunction, this, 0, NULL);
handle == INVALID_HANDLE_VALUE ? ret = false : m_threadPool.push_back(handle);
}
return ret;
}
virtual void StopThread()
{
m_threadRun = false;
for (int i = 0; i < m_threadPool.size(); ++i)
{
::CloseHandle(m_threadPool[i]);
}
}
virtual void Run() = 0;
private:
static DWORD WINAPI ThreadFunction(LPVOID p)
{
ThreadPool *_this = (ThreadPool*)p;
_this->Run();
return 0;
}
protected:
bool m_threadRun;
private:
vector<HANDLE> m_threadPool;
};
class TestThreadPool : public ThreadPool
{
public:
virtual bool StartThread(int threadCount)
{
return ThreadPool::StartThread(threadCount);
}
virtual void StopThread()
{
TestThreadPool::StopThread();
}
virtual void Run()
{
while (ThreadPool::m_threadRun)
{
cout << "Now threadId = " << GetCurrentThreadId() << endl;
}
}
};
int main()
{
TestThreadPool temp;
temp.StartThread(20);
Sleep(100000);
return 0;
}
ThreadPool
类中并没有直接接受或者传入子类对象,但是是可以直接调用子类的Run()
函数目前个人认为是子类中调用父类的
ThreadPool::StartThread(threadCount)
函数时, 默认会将自己的this指针当作参数传入到父类的StartThread()
中, 从而导致了CreateThread()
绑定this
对象为子类对象的this
指针,因此调用Run()
函数时由于多态原因调用了子类的Run()
方法。- 打印出来的由于并没有做锁机制,所以出现了打印混乱的现象,如何实现线程锁
后续补充