multithreading - 如何使用MFC CriticalSection?

标签 multithreading mfc critical-section

我正在研究一个小示例,并且对在我的示例中使用临界区感到有点好奇。 我正在做的是,我有一个 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/

相关文章:

c# - 在线程之间传递 List<Polyline>

java - 使用 .wait 和 .notify 进行对象池

c++ - 如何初始化堆以便它可以被常规 MFC dll 中的静态构造函数使用?

delphi - 关键部分能帮助解决这个问题吗?

c# - C# 数组中的线程安全

c - 当进程进入信号量(临界区)并休眠时会发生什么?

使用 std::thread 的 C++ 多线程应用程序在 Windows 上运行良好,但在 Ubuntu 上运行不正常

ios - 调用 (NSRunLoop)-run() 和 CFRunLoopRun() 有什么区别

c++ - VS2012 : “Cannot find the resource compiler DLL. Please make sure the path is correct.”

c++ - MFC中如何让背景变成半透明?