|
本帖最后由 safeboy 于 2020-4-27 22:47 编辑
高级班-多线程-[6]线程间的同步机制课程中,向全局数组加入成员时,并非按顺序加入
在实际应用中极可能造成出错,请问有什么方式可以解决?
全局变量定义:
- CStringArray g_strAry; //MFC中 的CArray类 中的 CStringArray 动态数组中
- CRITICAL_SECTION g_CriSec; //定义一个 全局的多线程 关键区(许可证)
复制代码
线程函数:
- UINT __cdecl MoreThreadProc(LPVOID pParam)
- {
- //主进程传递进来 10 20 30 ~ 500的序号
- int startIdx = (int)pParam;
- //从传递的序号开始 循环加100次
- // 10 11 12 ~ 109
- // 20 21 22 ~ 119
- for (int i=startIdx;i<startIdx+100;++i)
- {
- CString strNum;
- strNum.Format(_T("%d"), i);
- EnterCriticalSection(&g_CriSec);
- g_strAry.Add(strNum);
- //g_strAry2.Add(strNum);
- //g_strAry3.Add(strNum);
- //不要设置多个CriticalSection
- //可以将需要操作的多个全局变量都放在
- //只需要在有对全局变量操作的代码,才需要开启多线程许可机制
- //或者说在Enter 和 Leave 之间不要执行时间太长的代码
- LeaveCriticalSection(&g_CriSec);
- }
- return 0;
- }
复制代码
线程启动代码:
- void CMoreThreadDlg::OnBnClickedBtnMorethread()
- {
- InitializeCriticalSection(&g_CriSec); //初始化关键区(许可证)
- for (int i=1;i<=50;++i)
- {
- CWinThread* pThread = AfxBeginThread(MoreThreadProc, (LPVOID)(i * 10));
- //启动50条线程,且传递 10 20 30~ 500的序号给线程函数
- }
- }
复制代码
检索全局动态数组代码:
- void CMoreThreadDlg::OnBnClickedBtnResult()
- {
- int arryCount = g_strAry.GetCount();
- CString strAryCount;
- strAryCount.Format(_T("%d"), arryCount);
- if (MessageBox(_T("当前数组总数为:")+strAryCount,_T("是否要读取全部数组成员?"),MB_OKCANCEL)==IDOK)
- {
- for (int i=0;i<arryCount;++i)
- {
- m_edt_status.SetSel(-1);
- m_edt_status.ReplaceSel(g_strAry.GetAt(i)+_T("\r\n"));
- }
- }
- DeleteCriticalSection(&g_CriSec); //不要忘记退出关键区(许可证)
- }
复制代码
打印到编辑中的结果:
这个东西本身就是异步的,靠关键区来进行线程同步,谁抢到了就谁先写入,所以可以保证同一时间只能是一个线程往 CStringArray 数组中插,但是无法保证是按照指定的顺序。
|
上一篇: 各位大佬,麻烦帮我看一下QT中国象棋的问题下一篇: 在Windows编程编写第一个实例的时候,为什么链接不到windows.h这个头文件啊啊啊啊
|