130 linux windows multithreading programming-languages
请从Linux,Windows的角度解释一下?
我用C#编程,这两个术语会有所不同.请尽可能多地发布,举例等等......
谢谢
Mic*_*ael 222
对于Windows,关键部分比互斥体重量更轻.
互斥体可以在进程之间共享,但总是会导致对内核的系统调用,这会产生一些开销.
关键部分只能在一个进程中使用,但具有以下优点:它们仅在争用情况下切换到内核模式 - 非常见的获取(应该是常见情况)非常快.在争用的情况下,它们进入内核以等待一些同步原语(如事件或信号量).
我写了一个快速的示例应用程序,比较两者之间的时间.在我的系统上,1,000,000个无争用的获取和释放,互斥量需要一秒钟.1,000,000个采集的关键部分需要约50毫秒.
这是测试代码,如果互斥是第一个或第二个,我运行它并得到类似的结果,所以我们没有看到任何其他效果.
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);
Run Code Online (Sandbox Code Playgroud)
Dan*_*ner 85
从理论的角度来看,关键部分是一段代码,由于代码访问共享资源,因此不能同时由多个线程运行.
甲互斥是用来保护临界区的算法(和有时的数据结构的名称).
实际上,在Windows中可以使用许多互斥实现.它们的主要不同之处在于它们的锁定水平,范围,成本以及在不同争用水平下的表现.请参阅CLR Inside Out - 将并发性用于可伸缩性,以获取不同互斥实现的成本图表.
可用的同步原语.
该lock(object)声明使用Monitor- 参见MSDN实现.
在过去几年中,对非阻塞同步进行了大量研究.目标是以无锁或无等待的方式实现算法.在这样的算法中,过程有助于其他过程完成其工作,以便过程最终完成其工作.因此,即使当试图执行某些工作的其他进程挂起时,进程也可以完成其工作.Usinig锁定,他们不会释放锁定并阻止其他进程继续.
180*_*ION 21
除了其他答案之外,以下详细信息特定于Windows上的关键部分:
InterlockedCompareExchange操作一样简单在linux中,我认为他们有一个"旋转锁定",它与具有旋转计数的关键部分具有相似的目的.
The*_*own 18
Critical Section和Mutex不是特定于操作系统的,它们是多线程/多处理的概念.
关键部分 是一段代码,必须在任何给定时间自行运行(例如,有5个线程同时运行,而一个名为"critical_section_function"的函数更新数组...你不想要所有5个线程一次更新数组.因此,当程序运行critical_section_function()时,其他任何线程都不能运行其critical_section_function.
mutex* Mutex是一种实现关键部分代码的方式(将其视为一个令牌......线程必须拥有它才能运行critical_section_code)
Zif*_*fre 13
互斥锁是线程可以获取的对象,阻止其他线程获取它.这是咨询,而不是强制性的; 线程可以使用互斥体所代表的资源而无需获取它.
关键部分是操作系统保证不会中断的一段代码.在伪代码中,它会像:
StartCriticalSection();
DoSomethingImportant();
DoSomeOtherImportantThing();
EndCriticalSection();
Run Code Online (Sandbox Code Playgroud)
小智 6
只是为了增加我的2美分,关键部分被定义为结构,并且在它们上的操作在用户模式上下文中执行.
ntdll!_RTL_CRITICAL_SECTION +0x000 DebugInfo : Ptr32 _RTL_CRITICAL_SECTION_DEBUG +0x004 LockCount : Int4B +0x008 RecursionCount : Int4B +0x00c OwningThread : Ptr32 Void +0x010 LockSemaphore : Ptr32 Void +0x014 SpinCount : Uint4B
而互斥是在Windows对象目录中创建的内核对象(ExMutantObjectType).互斥操作主要在内核模式下实现.例如,在创建Mutex时,最终会在内核中调用nt!NtCreateMutant.
| 归档时间: |
|
| 查看次数: |
89510 次 |
| 最近记录: |