如何使用关键部分 - MFC?

Posted

技术标签:

【中文标题】如何使用关键部分 - MFC?【英文标题】:How to use CriticalSection - MFC? 【发布时间】:2010-05-04 05:18:23 【问题描述】:

我正在研究一个小例子,我对在我的例子中使用临界区有点好奇。 我正在做的是,我有一个 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);
    

【问题讨论】:

【参考方案1】:

我使用 CriticalSection 的方式是:

CThreadingEx4Dlg 类中声明一个成员变量:

CCriticalSection m_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();

【讨论】:

【参考方案2】:

考虑使用 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

【讨论】:

通常避免仅使用代码的答案。考虑添加有助于解释代码的description。谢谢

以上是关于如何使用关键部分 - MFC?的主要内容,如果未能解决你的问题,请参考以下文章

vc6.0如何高亮显示mfc关键字

MFC 如何在一个类中使用另一个类中定义的变量

MFC如何使用静态MFC库

MFC,如何更改 TabCtrl 的标题

如何修复 MFC 绘画故障?

如何使用 mfc 应用程序在文件中写入特殊字符?