我正在研究一个小示例,并且对在我的示例中使用临界区感到有点好奇。 我正在做的是,我有一个 CStringArray(其中添加了 10 个元素)。我想复制 这10个元素(字符串)到另一个CStringArray(这样做是为了理解线程和关键部分),我创建了2个线程,Thread1将把前5个元素复制到另一个CStringArray,Thread2将复制其余的元素。这里使用了两个CStringArray ,我知道一次只有 1 个线程可以访问它。我想知道如何使用临界区或任何其他方法来解决这个问题。
void CThreadingEx4Dlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
thread1 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction1,this);
thread2 = AfxBeginThread((AFX_THREADPROC)MyThreadFunction2,this);
}
UINT MyThreadFunction1(LPARAM lparam)
{
CThreadingEx4Dlg* pthis = (CThreadingEx4Dlg*)lparam;
pthis->MyFunction(0,5);
return 0;
}
UINT MyThreadFunction2(LPARAM lparam)
{
CThreadingEx4Dlg* pthis = (CThreadingEx4Dlg*)lparam;
pthis->MyFunction(6,10);
return 0;
}
void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount)
{
for(int i=minCount;i<=maxCount;i++)
{
CString temp;
temp = myArray.GetAt(i);
myShiftArray.Add(temp);
}
}
最佳答案
我使用 CriticalSection 的方式是:
在
CThreadingEx4Dlg
类中声明一个成员变量:CCriticalSection m_CriticalSection;
将非线程安全代码包含在此 CriticalSection 的 Lock-Unlock block 中:
void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount) { m_CriticalSection.Lock(); for(int i=minCount;i<=maxCount;i++) myShiftArray.Add(myArray.GetAt(i)); m_CriticalSection.Unlock(); }
关于multithreading - 如何使用MFC CriticalSection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2762971/