为什么5个工作线程的执行顺序保持不边?达人请进.
czb 2007-08-07 05:03:43 程序首先创建了一个投递线程,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);
CString string;
string.Format(_T("count=%d\r\n"),count);
//string.Append(_T(","));
for(int i=0;i<5;i++)
{
CString threadNO;
threadNO.Format(_T("Thread No:%d\r\n"),i);
string.Append(threadNO);
while(!lst_p_thread_data[i].empty())
{
CString values;
values.Format(_T("%d,"),lst_p_thread_data[i].front());
lst_p_thread_data[i].pop();
string.Append(values);
}
string.Append(_T("\r\n"));
}
mFile.WriteString(string);
mFile.Close();
}
class CDataWriterDlg : public CDialog
{
// 构造
public:
CDataWriterDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_DATAWRITER_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
public:
CWinThread* pPostThread;
CWinThread* pWorkThread[5];
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDestroy();
public:
afx_msg void OnBnClickedStart();
public:
afx_msg void OnBnClickedStop();
public:
afx_msg void OnBnClickedSave();
public:
CStatic m_display_static;
};