Как использовать CriticalSection - MFC? - PullRequest
2 голосов
/ 04 мая 2010

Я работаю над небольшим примером, и мне немного любопытно использовать критическое сечение в моем примере. То, что я делаю, у меня есть 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);
    }
}

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Я бы использовал CriticalSection:

  • Объявите переменную-член в вашем CThreadingEx4Dlg классе:

    CCriticalSection m_CriticalSection;
    
  • Включите свой небезопасный код в блок Lock-Unlock этого CriticalSection:

    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 голос
/ 26 марта 2015

Рассмотрите возможность использования 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
}
...