//c++ builder TThread类有临界区,但是要写个类不爽。
//直接使用windows?CRITICAL_SECTION 就便捷些。
//本文在c++ builder 6调试通过。 ?#include <stdio.h> #include <windows.h>
const unsigned int THREAD_NUM = 50; unsigned int g_Count = 0; CRITICAL_SECTION cs; //声明关键段 DWORD WINAPI ?ThreadFunc(LPVOID);
int main(int argc, char* argv[]) { ?? ?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; }
|