我正在研究一个小例子,并且在我的例子中使用criticalsection有点好奇。 我正在做的是,我有一个CStringArray(添加了10个元素)。我想要复制 这10个元素(字符串)到另一个CStringArray(这样做是为了理解线程和Critical部分),我创建了2个线程,Thread1将前5个元素复制到另一个CStringArray,而Thread2将复制其余的。这两个CStringArray正被使用,我知道一次只有一个线程可以访问它。我想知道如何通过使用criticalsection或任何其他方法来解决这个问题。
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);
}
}
答案 0 :(得分:2)
我使用CriticalSection的方式是:
在CThreadingEx4Dlg
类中声明成员变量:
CCriticalSection m_CriticalSection;
将非线程安全代码包含在此CriticalSection的Lock-Unlock块中:
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();
}
答案 1 :(得分:1)
考虑使用CSingleLock,以便构造函数负责锁定,析构函数自动处理解锁
void CThreadingEx4Dlg::MyFunction(int minCount,int maxCount)
{
CSingleLock myLock(&m_CriticalSection, TRUE);
// do work here.
// The critical section will be unlocked when myLock goes out of scope
}