为什么5个工作线程的执行顺序保持不边?达人请进.该怎么处理
为什么5个工作线程的执行顺序保持不边?达人请进.
程序首先创建了一个投递线程,5个工作线程(线程0、线程1、线程2、线程3、线程4)。投递线程用于产生数据,并把产生的数据放到一个队列中。5个工作线程从这个数据队列中提取数据,并把提取后的数据给删掉,并随机延迟一段时间。
每个工作线程延迟一个随机的时间后,继续从数据队列中提取数据。
这5个工作线程是处于竞争状态的,如线程0、线程1、线程3、线程4处于运行状态,线程2处于空闲状态,则下一次系统调度,就调用线程2。
现在我的问题是,程序中这5个工作线程,是按顺序处理队列数据的。即先是线程1处理数据,再是线程2,3,4,0;一个循环之后,还是1、2、3、4、0;再循环之后,接着还是1、2、3、4、0...
这5个工作线程根本就没有抢时间去跑。
付关键代码如下
#define workThreadCount 5;
volatile bool isMainThreadWorking;
std::queue <int> lst_data;
std::queue <int> lst_p_thread_data[5];
int count;
CCriticalSection critical_section;
CEvent eventBeginWork;
UINT postThread(LPVOID pParam);
UINT workThread(LPVOID pParam);
UINT postThread(LPVOID pParam)
{
time_t t;
srand((unsigned) time(&t));
while(isMainThreadWorking&&count <10000){
critical_section.Lock();
lst_data.push(count);
count++;
critical_section.Unlock();
if(count%10==0)
{
eventBeginWork.SetEvent();
}
Sleep(rand()%800);
}
return 0;
}
UINT workThread(LPVOID pParam)
{
int ThreadNo;
std::queue <int> lst_work_thread_data;
time_t t;
srand((unsigned) time(&t));
ThreadNo = *((int*)pParam);
//CString sPrintMessage;
//sPrintMessage.Format(_T( "线程%d开始 "),ThreadNo);
//AfxMessageBox(sPrintMessage);
while(isMainThreadWorking){
WaitForSingleObject(eventBeginWork,INFINITE);
critical_section.Lock();
CString threadNo;
threadNo.Format(_T( "线程%d正在运行 "),ThreadNo);
//((CDataWriterDlg*)AfxGetApp()-> m_pMainWnd)-> m_display_static.SetWindowTextW(threadNo);
while(!lst_data.empty())
{
lst_work_thread_data.push(lst_data.front());
lst_data.pop();
}
critical_section.Unlock();
Sleep(rand()%1200);
}
while(!lst_work_thread_data.empty())
{
lst_p_thread_data[ThreadNo].push(lst_work_thread_data.front());
lst_work_thread_data.pop();
}
return 0;
}
void CDataWriterDlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
isMainThreadWorking = true;
pPostThread = AfxBeginThread((AFX_THREADPROC)postThread,NULL);
for(int i=0;i <5;i++)
{
pWorkThread[i] = AfxBeginThread((AFX_THREADPROC)workThread,(LPVOID)&i);
}
}
void CDataWriterDlg::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码
isMainThreadWorking = false;
WaitForSingleObject(pPostThread-> m_hThread,INFINITE);
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
WaitForSingleObject(pWorkThread[0]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[1]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[2]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[3]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[4]-> m_hThread,INFINITE);
}
void CDataWriterDlg::OnBnClickedSave()
{
// TODO: 在此添加控件通知处理程序代码
CStdioFile mFile;
CFileException mExcept;
mFile.Open(_T( "Result.txt "), CFile::modeCreate|CFile::modeWrite, &mExcept);
程序首先创建了一个投递线程,5个工作线程(线程0、线程1、线程2、线程3、线程4)。投递线程用于产生数据,并把产生的数据放到一个队列中。5个工作线程从这个数据队列中提取数据,并把提取后的数据给删掉,并随机延迟一段时间。
每个工作线程延迟一个随机的时间后,继续从数据队列中提取数据。
这5个工作线程是处于竞争状态的,如线程0、线程1、线程3、线程4处于运行状态,线程2处于空闲状态,则下一次系统调度,就调用线程2。
现在我的问题是,程序中这5个工作线程,是按顺序处理队列数据的。即先是线程1处理数据,再是线程2,3,4,0;一个循环之后,还是1、2、3、4、0;再循环之后,接着还是1、2、3、4、0...
这5个工作线程根本就没有抢时间去跑。
付关键代码如下
#define workThreadCount 5;
volatile bool isMainThreadWorking;
std::queue <int> lst_data;
std::queue <int> lst_p_thread_data[5];
int count;
CCriticalSection critical_section;
CEvent eventBeginWork;
UINT postThread(LPVOID pParam);
UINT workThread(LPVOID pParam);
UINT postThread(LPVOID pParam)
{
time_t t;
srand((unsigned) time(&t));
while(isMainThreadWorking&&count <10000){
critical_section.Lock();
lst_data.push(count);
count++;
critical_section.Unlock();
if(count%10==0)
{
eventBeginWork.SetEvent();
}
Sleep(rand()%800);
}
return 0;
}
UINT workThread(LPVOID pParam)
{
int ThreadNo;
std::queue <int> lst_work_thread_data;
time_t t;
srand((unsigned) time(&t));
ThreadNo = *((int*)pParam);
//CString sPrintMessage;
//sPrintMessage.Format(_T( "线程%d开始 "),ThreadNo);
//AfxMessageBox(sPrintMessage);
while(isMainThreadWorking){
WaitForSingleObject(eventBeginWork,INFINITE);
critical_section.Lock();
CString threadNo;
threadNo.Format(_T( "线程%d正在运行 "),ThreadNo);
//((CDataWriterDlg*)AfxGetApp()-> m_pMainWnd)-> m_display_static.SetWindowTextW(threadNo);
while(!lst_data.empty())
{
lst_work_thread_data.push(lst_data.front());
lst_data.pop();
}
critical_section.Unlock();
Sleep(rand()%1200);
}
while(!lst_work_thread_data.empty())
{
lst_p_thread_data[ThreadNo].push(lst_work_thread_data.front());
lst_work_thread_data.pop();
}
return 0;
}
void CDataWriterDlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
isMainThreadWorking = true;
pPostThread = AfxBeginThread((AFX_THREADPROC)postThread,NULL);
for(int i=0;i <5;i++)
{
pWorkThread[i] = AfxBeginThread((AFX_THREADPROC)workThread,(LPVOID)&i);
}
}
void CDataWriterDlg::OnBnClickedStop()
{
// TODO: 在此添加控件通知处理程序代码
isMainThreadWorking = false;
WaitForSingleObject(pPostThread-> m_hThread,INFINITE);
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
eventBeginWork.SetEvent();
WaitForSingleObject(pWorkThread[0]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[1]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[2]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[3]-> m_hThread,INFINITE);
WaitForSingleObject(pWorkThread[4]-> m_hThread,INFINITE);
}
void CDataWriterDlg::OnBnClickedSave()
{
// TODO: 在此添加控件通知处理程序代码
CStdioFile mFile;
CFileException mExcept;
mFile.Open(_T( "Result.txt "), CFile::modeCreate|CFile::modeWrite, &mExcept);