• 多线程专题之线程同步(1)


    #include "afxmt.h"   //使用同步类的头文件

    CCriticalSection g_CriticalSection; 
    //临界区对象,不可以用于进程间

    CEvent    g_Event1;    //自动重置事件,初始无信号状态
    CEvent    g_Event2(TRUE);  //自动重置事件,初始有信号状态
    CEvent    g_Event3(FALSE,TRUE); //人工重置事件,初始无信号状态
    CEvent    g_Event4(TRUE,TRUE); //人工重置事件,初始有信号状态
    //事件也可以用用于进程间

    CMutex    g_Mutex;   
    //互斥对象,可以用于进程间

    CSemaphore   g_Semaphore(2/*信号量对象的初始计数值,即有多少个线程可以访问*/,
            2/*信号量对象计数值的最大值,即同一时刻可访问的线程的最大数目,必须大于等于初始值*/); 
    //如果我们用g_Semaphore(2,2)的话,两个对话框会同时弹出。
    //如果我们用g_Semaphore(2,2)的话,你会发现测试弹出对话框中。必须在你关闭前一个对话框的时候,才会弹出另一个对话框。
    //信号量,可以用于进程间


    static DWORD SyncThreadProc1(
           LPVOID lpParameter
           )
    {
    /*
    // 临界区同步
     g_CriticalSection.Lock();
     AfxMessageBox( _T("SyncThreadProc1") );
     g_CriticalSection.Unlock();
    */
    /*
     事件对象
     WaitForSingleObject(g_Event1.m_hObject,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Event1.SetEvent();

     WaitForSingleObject(g_Event2.m_hObject,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Event2.SetEvent();
     

     WaitForSingleObject(g_Event3.m_hObject,INFINITE);
     g_Event3.ResetEvent();        //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Event3.SetEvent();

     
     WaitForSingleObject(g_Event4.m_hObject,INFINITE);
     g_Event4.ResetEvent();        //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Event4.SetEvent();
    */
    /*
     // 互斥对象同步
     g_Mutex.Lock();
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Mutex.Unlock();
    */
    /*
     // 信号量同步
     g_Semaphore.Lock();
     AfxMessageBox( _T("SyncThreadProc1") );
     g_Semaphore.Unlock();
    */
     return 0;
    }
    static DWORD SyncThreadProc2(
            LPVOID lpParameter
            )
    {
    /*
    // 临界区同步
     g_CriticalSection.Lock();
     AfxMessageBox( _T("SyncThreadProc2") );
     g_CriticalSection.Unlock();
    */
    /*
     事件对象
     WaitForSingleObject(g_Event1.m_hObject,INFINITE);
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Event1.SetEvent();

     WaitForSingleObject(g_Event2.m_hObject,INFINITE);
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Event2.SetEvent();


     WaitForSingleObject(g_Event3.m_hObject,INFINITE);
     g_Event3.ResetEvent();        //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Event3.SetEvent();


     WaitForSingleObject(g_Event4.m_hObject,INFINITE);
     g_Event4.ResetEvent();        //如果不将g_Event3置为无信号状态,两个对话框将同时弹出来。
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Event4.SetEvent();
    */

    /*
    // 互斥对象同步
     g_Mutex.Lock();
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Mutex.Unlock();
    */
    /*
     // 信号量同步
     g_Semaphore.Lock();
     AfxMessageBox( _T("SyncThreadProc2") );
     g_Semaphore.Unlock();
    */
     return 0;
    }
    void CMultiThreadDlg::OnBtnUsageSeven()
    {
     // TODO: Add your control notification handler code here
     //使用同步对象你会发现测试弹出对话框中。
     //必须在你关闭前一个对话框的时候,才会弹出另一个对话框。
     //这就是同步的作用
     
     HANDLE hThread1 = NULL;
     HANDLE hThread2 = NULL;

     hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SyncThreadProc1,NULL,0,NULL);
     hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SyncThreadProc2,NULL,0,NULL);
     
     //g_Event1.SetEvent();  //g_Event1置为有信号状态,如果不这样做的话,两个线程将永远等待不到信号
     //g_Event2.ResetEvent(); //g_Event2初始有信号现在置为无信号。两个线程将永远等待不到信号
     //g_Event3.SetEvent();  //g_Event3置为有信号状态,如果不这样做的话,两个线程将永远等待不到信号
     //g_Event4.ResetEvent(); //g_Event4初始有信号现在置为无信号。两个线程将永远等待不到信号
     
     if ( hThread1 ) CloseHandle(hThread1);
     if ( hThread2 ) CloseHandle(hThread2);

  • 相关阅读:
    Qt多表格滚动条同步
    Trie树
    计算机网络笔记--网络层--ICMP协议
    计算机网络笔记--网络层--NAT
    计算机网络笔记--IP地址
    计算机网络笔记--网络层--ARP协议
    计算机网络笔记--网络层1IP协议
    const与指针
    c/c++笔记--指向数组的指针与二维数组
    机试笔记9--二叉树的遍历
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/1989563.html
Copyright © 2020-2023  润新知