SleepConditionVariableSRW线程最佳同步实现

xiaoxiao2021-02-28  4

  1  几个关键函数

      

//条件休眠线程 BOOL SleepConditionVariableSRW ( PCONDITION_VARIABLE ConditionVariable, PSRWLOCK SRWLock, DWORD dwMilliseconds, ULONG Flags); // 唤醒一个等待条件变量的线程 VOID WakeConditionVariable (PCONDITION_VARIABLE ConditionVariable); // 唤醒所有等待条件变量的线程 VOID WakeAllConditionVariable (PCONDITION_VARIABLE ConditionVariable);

  //------------------------------------------

 2  样例

     2.1  三个变量

      

BOOL RUNNING=FALSE; SRWLOCK g_srwlock; //读写同步对象 CONDITION_VARIABLE g_full; //条件变量

     2.2  线程

UINT ThreadFun(LPVOID) { AfxMessageBox(TEXT("Thread IS BEGINNING")); /* 1)启动线程前执行 AcquireSRWLockExclusive(&g_srwlock); 可以阻止线程继续执行, 如果想让线程继续,只需执行 ReleaseSRWLockExclusive(&g_srwlock); */ /* 2)通过布尔变量判断,利用条件休眠可以阻止线程继续 如果想让线程继续,只需执行 WakeAllConditionVariable(&g_full); */ AcquireSRWLockExclusive(&g_srwlock); if (RUNNING==FALSE) SleepConditionVariableSRW(&g_full, &g_srwlock, INFINITE, 0); AfxMessageBox(TEXT("Thread is continue")); for(int i=0;i<100;++i) { Sleep(50);} ReleaseSRWLockExclusive(&g_srwlock); AfxMessageBox(TEXT("Thread IS OVER")); return 1; }

    2.3  启动线程并休眠

InitializeSRWLock(&g_srwlock); //1)AcquireSRWLockExclusive(&g_srwlock); AfxBeginThread(ThreadFun,NULL);

   2.4  唤醒线程继续执行

//1) //ReleaseSRWLockExclusive(&g_srwlock); WakeAllConditionVariable(&g_full);

转载请注明原文地址: https://www.6miu.com/read-200311.html

最新回复(0)