barbyQAQ 2021-02-01 19:44 采纳率: 0%
浏览 19

临界区线程同步_疑惑

临界区线程同步那个,发现两个线程并不是完全地交替执行,这算是合格了吗???正常吗???

我感觉是: 正在使用临界区的线程 离开临界区后 又立刻进入临界区,另一个线程只能拼速度才能进到临界区……

#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--执行!

这个正常吗?还是我的代码有问题啊???

 

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-06-24 03:58
    关注

    您提到的情况是正常的。临界区是一种线程同步机制,它可以保证在同一时间只有一个线程访问共享资源。但是,临界区并不能保证线程交替执行。当一个线程离开临界区时,操作系统会选择另一个等待进入临界区的线程,但这并不意味着它一定会选择另一个线程。因此,您所描述的情况是可能发生的。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何将这个项目的ssh-TCP,改成ssh3-UDP协议
  • ¥20 ic卡dump文件校检码解密
  • ¥15 关于:接收到的数据不是有效的JSON格式
  • ¥15 apdl语言如何增加受力分析
  • ¥15 算法对比:学校优化算法与蚁群算法对比
  • ¥15 机电一体化系统设计说明书
  • ¥20 sgy数据提取地震波速,有人能回答吗小馋
  • ¥20 c#实现打开word的功能,并且需要安装成windows服务,word打不开怎么办
  • ¥15 python用ARIMA时间预测模型预测数据出错,急!
  • ¥30 为什么后端传给前端vue的河流json数据不在地图中显示出来