Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用多线程保护信号量队列_Multithreading_Operating System_Binary Semaphore - Fatal编程技术网

Multithreading 如何使用多线程保护信号量队列

Multithreading 如何使用多线程保护信号量队列,multithreading,operating-system,binary-semaphore,Multithreading,Operating System,Binary Semaphore,在一次采访中我被问到 Wait(semaphore sem) { DISABLE_INTS sem.val-- if (sem.val < 0){ add thread to sem.L block(thread) } ENABLE_INTS Wait(信号量sem){ 禁用链接 sem.val-- if(sem.val

在一次采访中我被问到

Wait(semaphore sem) {                           
   DISABLE_INTS
   sem.val--
   if (sem.val < 0){
      add thread to sem.L
      block(thread)
    }
ENABLE_INTS
Wait(信号量sem){
禁用链接
sem.val--
if(sem.val<0){
在sem.L中添加螺纹
块(螺纹)
}
启用\u int
上面是信号量等待实现(从其他线程复制)。
当多个线程尝试排队(当它们无法获得锁时)时,如何保护队列sem.L?我们在更新队列之前锁定吗?

这是一个仅具有单个核心的系统实现。通过在关键部分禁用中断来管理并发性。这就是“禁用中断”和“启用中断”的含义都在那个代码里

除非你面试的是一个为单核系统开发多任务操作系统代码的职位,否则这是一个奇怪的问题。也许面试官希望你问一些关于代码的问题,看看你是否能理解在什么情况下这是有意义的

冲突只能发生在此核心或其他核心上运行的代码。因为只有一个核心,所以唯一可能的冲突是与此核心上运行的代码冲突。这需要上下文切换


上下文切换有两种形式,自愿性和非自愿性。自愿性上下文切换发生在代码显式请求上下文切换时。此代码不请求上下文切换,因此这不是问题。非自愿性上下文切换只能由中断触发,并且此代码在其关键部分禁用中断。这是一个典型的错误路“锁”是在单核系统的内核代码中实现的。

对不起……我的问题是,当我们没有获得锁时,我们会尝试将调用进程添加到队列中。该队列是如何同步的。我们是否为该队列获取锁?David已经解释过了。由于只有一个内核,并且中断被禁用,因此不需要锁,因为代码无法执行您不理解David的回答,您需要进一步了解计算机体系结构和操作系统内核功能。@SureshChowta它与来自其他内核的访问同步,因为没有其他内核。通过禁用中断,它与在同一内核上运行的其他代码同步--禁用中断时,不可能进行上下文切换,因为只有中断才能触发非自愿的上下文切换。要理解这一点,需要理解并发是如何在较低级别上进行管理的,而不是没有内核编码经验的典型程序员所拥有的知识。问某人o不需要具备内核开发知识。@DavidSchwartz谢谢你试图让我理解。为什么我们在这里只讨论单核。我的代码或实现没有提到这一点。不是吗?如果多核系统中有其他线程在不同的核上运行,会发生什么情况g排队到同一个Q.@SureshChowta“我的代码或实现没有提到这方面的任何内容。”它将中断的禁用视为一个锁,只在单核系统上工作。“如果多核系统中运行在不同核上的其他线程试图排队到同一个Q,会发生什么情况?”我们使用适合该情况的不同代码。由于该代码不适合该情况,因此如果我们处于该情况,我们不会使用它。