临界区线程同步那个,发现两个线程并不是完全地交替执行,这算是合格了吗???正常吗???
我感觉是: 正在使用临界区的线程 离开临界区后 又立刻进入临界区,另一个线程只能拼速度才能进到临界区……
#include <stdio.h>
#include <windows.h>
DWORD WINAPI fun1(LPVOID lpParamter);
DWORD WINAPI fun2(LPVOID lpParamter);
CRITICAL_SECTION Section;
int i=1;
int main(void)
{
HANDLE hThread1,hThread2;
hThread1=::CreateThread(NULL,0,fun1,NULL,0,NULL);
hThread2=::CreateThread(NULL,0,fun2,NULL,0,NULL);
::CloseHandle(hThread1);
::CloseHandle(hThread2);
InitializeCriticalSection(&Section);
::Sleep(1000);
DeleteCriticalSection(&Section);
getchar();
return 0;
}
DWORD WINAPI fun1(LPVOID lpParamter)
{
for(;;)
{
EnterCriticalSection(&Section);
printf("%d线程 1--fun1--执行!\n",i);
i++;
LeaveCriticalSection(&Section);
}
return 0;
}
DWORD WINAPI fun2(LPVOID lpParamter)
{
for(;;)
{
EnterCriticalSection(&Section);
printf("%d线程 2--fun2--执行!\n",i);
i++;
LeaveCriticalSection(&Section);
}
return 0;
}
这个执行结果就是:
N行的:线程 1--fun1--执行!
N行的:线程 2--fun1--执行!
N行的:线程 1--fun1--执行!
N行的:线程 2--fun1--执行!
……………………
然而我以为会是理想状态:
单行交替显示:
线程 1--fun1--执行!
线程 2--fun1--执行!
这个正常吗?还是我的代码有问题啊???
您提到的情况是正常的。临界区是一种线程同步机制,它可以保证在同一时间只有一个线程访问共享资源。但是,临界区并不能保证线程交替执行。当一个线程离开临界区时,操作系统会选择另一个等待进入临界区的线程,但这并不意味着它一定会选择另一个线程。因此,您所描述的情况是可能发生的。