Sleep函数与线程
贴上一篇关于这个主题的文章链接有助于理解VC++ Sleep函数原理及Sleep(0)的使用(文章较深入但通俗易懂)
Sleep函数能执行挂起一段时间,但它是针对线程还是进程的,这点需要深究
由该解释可知,Sleep函数是将调用其的线程挂起
这也具有合理性,因为若是针对进程,在不同的线程中进行调用时,
会对整个进程造成多次阻塞,这样并不高效,同时也降低了自由度,
是缺乏美感的
辣么,怎样验证呢,话不多说,贴代码
#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Fun1Pro(LPVOID lpParameter);
DWORD WINAPI Fun2Pro(LPVOID lpParameter);
int tickets = 100;
HANDLE hMutex = NULL;
int main()
{
hMutex = CreateMutex(NULL, FALSE, NULL);
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, Fun1Pro, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Fun2Pro, NULL, 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(1000);
return 0;
}
DWORD WINAPI Fun1Pro(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
Sleep(5);
cout << "thread1 sell ticket : " << tickets-- << endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Fun2Pro(LPVOID lpParameter)
{
while (TRUE)
{
WaitForSingleObject(hMutex, INFINITE);
if (tickets > 0)
{
Sleep(5);
cout << "thread2 sell ticket : " << tickets-- << endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
该段代码效用非常简单,分线程输出100到1;线程1、2在每次输出前都挂起五个单位时间,main()即主线程中在线程1、2开启后,挂起1000个单位时间结束,下面为执行后的结果
可以看到,代码成功执行
那么,我们可以设想,既然Sleep针对线程,在线程1、2用时比主线程生命线还要长时会发生什么呢
接下来,我们将主线程Sleep的参数更改为200,由于线程1、2的挂起时间都为5,执行次数为50次,很明显,加上执行时间,线程1、2每次执行都要花费大于5单位的时间,显然分线程用时比主线程生命线更长。
int main()
{
hMutex = CreateMutex(NULL, FALSE, NULL);
HANDLE hThread1;
HANDLE hThread2;
hThread1 = CreateThread(NULL, 0, Fun1Pro, NULL, 0, NULL);
hThread2 = CreateThread(NULL, 0, Fun2Pro, NULL, 0, NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
Sleep(200);//更改后
return 0;
}
执行代码
可知,线程1、2尚未完成即应主线程生命线结束而被迫中止。
为了编程的自由度与美感,Sleep()的使用方式有可能带来问题,这一点尤需注意
注意:sleep函数在各系统中单位不同
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒