当前位置:编程学习 > 网站相关 >>

多线程同步方式一:临界段

多线程同步方式一:临界段
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; 
}
运行结果:(错误用红色标出)
补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,