栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

互斥锁和临界区有什么区别?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

互斥锁和临界区有什么区别?

对于Windows,关键部分的权重比互斥轻。

互斥可以在进程之间共享,但是总是导致对内核的系统调用,这会产生一些开销。

关键部分只能在一个进程中使用,但具有的优势是,它们仅在争用的情况下才切换到内核模式-
无竞争的获取(这是常见的情况)非常快。在争用的情况下,它们进入内核以等待某些同步原语(例如事件或信号量)。

我编写了一个快速的示例应用程序,比较了两者之间的时间。在我的系统中,要进行1,000,000次无竞争的获取和释放,互斥体将占用一秒钟的时间。关键部分大约需要50毫秒才能完成1,000,000次采集。

这是测试代码,如果互斥是第一个或第二个,我会运行此代码并获得相似的结果,因此我们看不到任何其他效果。

HANDLE mutex = CreateMutex(NULL, FALSE, NULL);CRITICAL_SECTION critSec;InitializeCriticalSection(&critSec);LARGE_INTEGER freq;QueryPerformanceFrequency(&freq);LARGE_INTEGER start, end;// Force pre into memory, so we don't see any effects of paging.EnterCriticalSection(&critSec);LeaveCriticalSection(&critSec);QueryPerformanceCounter(&start);for (int i = 0; i < 1000000; i++){    EnterCriticalSection(&critSec);    LeaveCriticalSection(&critSec);}QueryPerformanceCounter(&end);int totalTimeCS = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);// Force pre into memory, so we don't see any effects of paging.WaitForSingleObject(mutex, INFINITE);ReleaseMutex(mutex);QueryPerformanceCounter(&start);for (int i = 0; i < 1000000; i++){    WaitForSingleObject(mutex, INFINITE);    ReleaseMutex(mutex);}QueryPerformanceCounter(&end);int totalTime = (int)((end.QuadPart - start.QuadPart) * 1000 / freq.QuadPart);printf("Mutex: %d CritSec: %dn", totalTime, totalTimeCS);


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号