为什么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);
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;
};
每个工作线程延迟一个随机的时间后,继续从数据队列中提取数据。
这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;
};
...全文
相关推荐
Javascript异步执行不按顺序解决方案
在上述标题和描述中提到的问题主要涉及两个案例,都是关于如何解决JavaScript异步执行不按顺序的问题。
sql执行顺序大总结
SQL 执行顺序大总结SQL 执行顺序是一个非常重要的概念,对于任何一个 SQL 开发者来说都非常重要。
SQL语句执行顺序图文介绍
**WHERE**: WHERE子句用于过滤不符合条件的行。它在FROM之后执行,根据指定的条件对中间结果进行筛选,只保留符合条件的记录。4.
testng注解方法执行顺序
除了上述的执行顺序,文档内容还提到了一些重要的注意事项:- @BeforeMethod/@AfterMethod注解对于每个@Test方法都会执行,不依赖于@Test方法的数量,这确保了测试方法的独立性
SQL执行顺序
- WHERE子句用于过滤不需要的数据,从而减少后续处理的数据量。5. **GROUP BY子句**:然后,vt4中的数据将根据GROUP BY子句中的列列表进行分组,生成vt5。


进程/线程/DLL
