多线程同步方式一:临界段
多线程同步方式一:临界段
1.常见问题
在一个进程中,多个线程是共享进程资源的,而由于线程的并发操作,如果不加控制,就有可能出现多个线程同时操作共享资源的情况,而造成操作混乱或出差等。有可能你不太相信,请看下面的一个实例,你可能会真实感受到问题的所在。
实例1说明:一个线程一次产生5个相同的随机数,另一个线程将这5个数输出。
//.h文件
//声明线程处理函数
unsigned __stdcall WriteThread( void*pArguments );//产生数据的线程函数
unsigned __stdcallReadThread( void*pArguments ); //读取数据的线程函数
//.cpp文件
//开始/停止
void CProbem1Dlg::OnBnClickedButtonDo()
{
// TODO: 在此添加控件通知处理程序代码
CString szText;
GetDlgItemText(IDC_BUTTON_DO,szText);
if(szText =="开始")
{
g_bRun = true;
SetDlgItemText(IDC_BUTTON_DO,"停止");
//创建产生随机数的线程
_beginthreadex(NULL,0,WriteThread,NULL,0,NULL);
//创建读取数据数的线程
_beginthreadex(NULL,0,ReadThread,&m_ctlList,0,NULL);
}
else
{
g_bRun = false;
SetDlgItemText(IDC_BUTTON_DO,"开始");
}
}
//产生随机数的线程函数
unsigned __stdcall WriteThread( void*pArguments )
{
int num = 1;
while(g_bRun)
{
num = 100+rand()%900;//产生位数的随机数
for(inti = 0;i < 5;i++)
{
g_nBuff[i] =num;
}
}
return 0;
}
//读取随机数的线程函数
unsigned __stdcall ReadThread( void* pArguments )
{
CListBox *pList= (CListBox*)pArguments;
CString szTemp;
while(g_bRun)
{
szTemp.Format("%d %d %d %d %d",g_nBuff[0],g_nBuff[1],g_nBuff[2],g_nBuff[3],g_nBuff[4]);
pList->AddString(szTemp);
}
return 0;
}
运行结果:(错误用红色标出)
补充:综合编程 , 其他综合 ,