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


    *---------------------------------------------------------*\
    另一种同步实现
    \*---------------------------------------------------------*/
    //CRITICAL_SECTION  g_cs;
    HANDLE     g_hEvent  = NULL;
    HANDLE     g_hMutex  = NULL;
    HANDLE     g_hSemaphore = NULL;

    static DWORD SynThreadProc1(
            LPVOID lpParameter
            )
    {
    /*
     EnterCriticalSection(&g_cs);
     AfxMessageBox( _T("SyncThreadProc1") );
     LeaveCriticalSection(&g_cs);
    */
    /*
     // 事件对象
     WaitForSingleObject(g_hEvent,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     SetEvent(g_hEvent);
    */
    /*
     // 互斥对象
     WaitForSingleObject(g_hMutex,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     ReleaseMutex(g_hMutex);
    */
    /*
     //  信号量对象
     WaitForSingleObject(g_hSemaphore,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     ReleaseSemaphore( g_hSemaphore , 1, NULL );
    */
     return 0;
    }
    static DWORD SynThreadProc2(
            LPVOID lpParameter
            )
    {
    /*
     EnterCriticalSection(&g_cs);
     AfxMessageBox( _T("SyncThreadProc2") );
     LeaveCriticalSection(&g_cs);
    */
    /*
    // 事件对象
     WaitForSingleObject(g_hEvent,INFINITE);
     AfxMessageBox( _T("SyncThreadProc2") );
     SetEvent(g_hEvent);
    */
    /*
     // 互斥对象
     WaitForSingleObject(g_hMutex,INFINITE);
     AfxMessageBox( _T("SyncThreadProc2") );
     ReleaseMutex(g_hMutex);
    */
    /*
     //  信号量对象
     WaitForSingleObject(g_hSemaphore,INFINITE);
     AfxMessageBox( _T("SyncThreadProc1") );
     ReleaseSemaphore( g_hSemaphore , 1, NULL );
    */
     return 0;
    }
    void CMultiThreadDlg::OnBtnUsageEight()
    {
     // TODO: Add your control notification handler code here
     
     HANDLE hThread1 = NULL;
     HANDLE hThread2 = NULL;

     //g_hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);
     //g_hMutex = CreateMutex(NULL,FALSE,NULL);
     g_hSemaphore = CreateSemaphore(NULL,1,1,NULL);

     hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SynThreadProc1,NULL,0,NULL);
     hThread2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)SynThreadProc2,NULL,0,NULL);

     //使用的时候,你要在适当的时候关闭句柄,不是在这里哦
     //if( g_hEvent )  CloseHandle(g_hEvent);
     //if( g_hMutex )  CloseHandle(g_hMutex);
     //if( g_hSemaphore ) CloseHandle(g_hSemaphore);
     
     if ( hThread1 ) CloseHandle(hThread1);
     if ( hThread2 ) CloseHandle(hThread2);
    }

    对于临界区要注意对象的初始化和删除:

    InitializeCriticalSection(&g_cs);

    DeleteCriticalSection(&g_cs);

  • 相关阅读:
    制作一个html中闪动的title 来提示消息
    Unicode与 utf8的互相转换
    程序员找女友的类
    使用php将数组转为XML
    自己动手画一个HTML5的按钮
    浏览器推通知给桌面
    如何使用定时任务
    封装之property,多态,鸭子类型,classmethod与staticmethod
    面向对象
    继承与派生
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/1989564.html
Copyright © 2020-2023  润新知