#include <stdio.h>
#include <windows.h>CRITICAL_SECTION gcs;DWORD threadA(void *lp);int main()
{
DWORD Thread_id[3];
HANDLE hThread[3];
InitializeCriticalSection(&gcs); //创建临界区
//创建线程
hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)1, 0, NULL);
hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)2, 0, NULL);
hThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)3, 0, NULL);
//等待所有线程结束
WaitForMultipleObjects(3, hThread, FALSE, 5000);
//删除临界区
printf("1000\n");
DeleteCriticalSection(&gcs);
CloseHandle(hThread);
return 0;
}DWORD threadA(void *lp)
{
int id = (int)lp;
int i = 0;
while(i < 20)
{
EnterCriticalSection(&gcs);
printf("thread %d i = %d\n", id, i++);
LeaveCriticalSection(&gcs);
}
return 0;
}就是while(i < 20){ } 这里不懂,我想只执行20次,用i < 20.可线程执行了37次,还有50次,这是为什么。还有用线程怎么才能让它只执行20次?
#include <windows.h>CRITICAL_SECTION gcs;DWORD threadA(void *lp);int main()
{
DWORD Thread_id[3];
HANDLE hThread[3];
InitializeCriticalSection(&gcs); //创建临界区
//创建线程
hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)1, 0, NULL);
hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)2, 0, NULL);
hThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadA, (void *)3, 0, NULL);
//等待所有线程结束
WaitForMultipleObjects(3, hThread, FALSE, 5000);
//删除临界区
printf("1000\n");
DeleteCriticalSection(&gcs);
CloseHandle(hThread);
return 0;
}DWORD threadA(void *lp)
{
int id = (int)lp;
int i = 0;
while(i < 20)
{
EnterCriticalSection(&gcs);
printf("thread %d i = %d\n", id, i++);
LeaveCriticalSection(&gcs);
}
return 0;
}就是while(i < 20){ } 这里不懂,我想只执行20次,用i < 20.可线程执行了37次,还有50次,这是为什么。还有用线程怎么才能让它只执行20次?
1)WaitForMultipleObjects(3, hThread, FALSE, 5000);
应该为
2)WaitForMultipleObjects(3, hThread, TRUE, 5000);
1) 只有一个线程结束WaitForMultipleObjects 就返回了,2)要全部才返回
当主线程(main)结束的时候 会主动结束其它线程,
============================================
EnterCriticalSection(&gcs);
while(i < 20)
{
printf("thread %d i = %d\n", id, i++);
}
LeaveCriticalSection(&gcs);
应该为
WaitForMultipleObjects(3, hThread, TRUE, 5000);线程没有工作顺序,线程是并行的,由于只有一个cpu,所以其实还是串行,一个cpu分配时间片给他们。
程序的主线程结束时,会强行结束 进程里的所有线程
main 是主线程,
开了hThread[0,1,2]三个工作线程,(和主线程获得CPU的执行权均等)
{四个线程交替运行(中间多加Sleep(0)分看得得清楚}
waitforMulObject (阻塞main主线程)
//waitFor 返回后,你的是hThreada[0]结束了)
剩下的三个线程平行(main又可以继续执行)
到main
return 后
hThead[1,2]还没有结束
在mainCRTStartup开始回收系统资源
强行结束hThead[1,2]这时thread[1,2]的while 还没有结束
DWORD nCount,
CONST HANDLE *lpHandles,
BOOL bWaitAll,//这个要TRUE 才是等所有的结束
DWORD dwMilliseconds //这个最好用 INFINITE 否则要判断返回值有没有 WAIT_TIMEOUT
);