当前位置: 首页 > 面试题库 >

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

孟智志
2023-03-14
问题内容

请从Linux,Windows角度进行解释?

我正在用C#编程,这两个术语会有所不同。请尽可能多地张贴带有示例等的内容。

谢谢


问题答案:

对于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 code 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 code 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: %d\n", totalTime, totalTimeCS);


 类似资料:
  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor

  • 本文向大家介绍请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别相关面试题,主要包含被问及请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1、互斥锁和读写锁区别: 互斥锁:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败时,线程会进入睡眠,等待锁释放时被唤醒。 读写锁:rwlock,分为读

  • Introduction This is the fourth part of the chapter which describes synchronization primitives in the Linux kernel and in the previous parts we finished to consider different types spinlocks and semap

  • 本文向大家介绍互斥锁死锁,包括了互斥锁死锁的使用技巧和注意事项,需要的朋友参考一下 死锁可以在使用互斥锁的多线程Pthread程序中发生。让我们看看它如何发生。未锁定的互斥锁由pthread_mutex_init()函数初始化。 使用pthread_mutex_lock()和pthread_mutex_unlock()获取并释放互斥锁。如果线程尝试获取锁定的互斥锁,则对pthread_mutex_

  • 主要内容:同步机制的要求临界区是试图访问共享资源的程序的一部分。 该资源可以是计算机中的任何资源,如内存位置,数据结构,CPU或任何IO设备。 临界区不能同时由多个进程执行; 操作系统在允许和禁止进程进入临界区时面临着困难。 临界区问题用于设计一组协议,可以确保进程间的竞争条件永远不会出现。 为了同步协作过程,我们的主要任务是解决临界区问题。 我们需要提供一个解决方案,以满足以下条件。 同步机制的要求 主 1. 相互排斥

  • 9.2. sync.Mutex互斥锁 在8.6节中,我们使用了一个buffered channel作为一个计数信号量,来保证最多只有20个goroutine会同时执行HTTP请求。同理,我们可以用一个容量只有1的channel来保证最多只有一个goroutine在同一时刻访问一个共享变量。一个只能为1和0的信号量叫做二元信号量(binary semaphore)。 gopl.io/ch9/bank