Frage

I‘ist auf einem kleines Beispiel arbeitet und ist ein bisschen neugierig mit Critical in meinem Beispiel. Was Ich bin zu tun ist, ich habe eine CStringArray (die ihm hinzugefügt 10 Elemente hat) .Ich kopieren möchten diese 10 Elemente (string) in einem anderen CStringArray (tun das Einfädeln und kritische Abschnitte zu verstehen), ich habe zwei Threads erstellt, Thread1 wird das erste 5-Element auf ein anderes CStringArray und Thread2 kopieren Sie die rest.Here zwei CStringArray kopiert werden eingesetzt, , ich weiß nur 1 Thread kann es bei einem time.I Zugriff wissen wollte, wie dies kann durch die Verwendung Critical oder andere Verfahren gelöst werden.

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);
    }
}
War es hilfreich?

Lösung

So wie ich ein Critical verwenden würde, ist:

  • Deklarieren Sie eine Membervariable in Ihrer CThreadingEx4Dlg Klasse:

    CCriticalSection m_CriticalSection;
    
  • Schliessen Sie Ihren nicht sicheren Code in einem Lock-Entsperren Block dieses Critical Gewinde:

    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();
    }
    

Andere Tipps

Erwägen Sie die Verwendung CSingleLock so dass der Konstruktor kümmert sich um die Verriegelung und die destructor kümmert sich automatisch um die Entriegelung

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top