admin管理员组

文章数量:1530516

//c++ builder TThread类有临界区,但是要写个类不爽。

//直接使用windows CRITICAL_SECTION 就便捷些。

//本文在c++ builder 10.3 64/32位,6.0调试通过。

#if(__BORLANDC__<=1380) // 低版本
#include <vcl.h>
#endif
 #include <stdio.h>
#include <windows.h>

const unsigned int THREAD_NUM = 50;
unsigned int g_Count = 0;
CRITICAL_SECTION cs; //声明关键段
DWORD WINAPI  ThreadFunc(LPVOID);

 #if(__BORLANDC__<=1380) // 低版本
  int main(int argc, char* argv[])
 #else  //高版本
  int _tmain(int argc, _TCHAR* argv[])
 #endif
{
    InitializeCriticalSection(&cs);    // 初始化关键段
    HANDLE hThread[THREAD_NUM];
        //int start=::GetTickCount();
    for (int i = 0; i < THREAD_NUM; i++)
    {
        hThread[i] = CreateThread(NULL, 0, ThreadFunc, 0, 0, NULL); // 创建线程
    }
        //int end1=::GetTickCount();
        //printf("耗时%d\n",end1-start);
    WaitForMultipleObjects(THREAD_NUM, hThread, true, INFINITE);    //一直等待,直到所有子线程全部返回
        //int end2=::GetTickCount();
    //printf(" 总共 %d 个线程给 g_Count 的值加一,现在 g_Count = %d\n", THREAD_NUM, g_Count);
        //printf("耗时%d\n",end2-end1);
    DeleteCriticalSection(&cs);        //销毁关键段
        system("pause");
    return 0;
}

DWORD WINAPI  ThreadFunc(LPVOID p)
{
    //Sleep(50);

    EnterCriticalSection(&cs);  // 进入关键段
    printf("%d\n",g_Count);
    g_Count++;
    LeaveCriticalSection(&cs);  // 离开关键段
    //Sleep(50);

    return 0;
}

本文标签: 临界WindowsCRITICALSECTION