我对并发编程问题存有疑问。 更具体地说,我们正在使用共享内存模型(即线程)。问题是:给定N个等价资源的池,存在约束,即在通用时刻t只能有一个使用资源R的线程,编写一个程序,根据需要将这些资源分配给请求它们的线程。要做到这一点,我们必须使用信号量。请注意,这些资源是什么以及线程对它们执行的操作超出了范围,重点是如何管理和分配资源。我的教授为资源管理器类提供了类似C / Java的伪代码解决方案:
class ResourcesManager {
semaphore mutex = 1;
semaphore availableResourcesSemaphore = N;
boolean available[N];
Resource resources[N];
public ResourcesManager(){
for(int i = 0; i < N; i++) {
available[i] = true;
resources[N] = new Resource();
}
}
public int acquireResource() {
int i = 0;
P(availableResourcesSemaphore);
P(mutex);
while(available[i]==false) i++;
available[i] = false;
V(mutex);
return i;
}
public void releaseResource(int i) {
P(mutex);
available[i] = true; //HERE IS THE PROBLEM
V(mutex);
V(availableResourcesSemaphore);
}
}
虽然我看到这个解决方案有效,但我还没有得到关于releaseResource(int i)方法的内容。为什么需要在评论中标注#34;这就是问题&#34;:
available[i] = true;
互斥执行?我已经考虑过了,如果我们不这样做,看起来没有什么不好的事情。 我的意思是,在最初的解决方案中,我们有:
P(mutex);
available[i] = true;
V(mutex);
我们可以简单地用
替换这三行available[i] = true;
并且解决方案仍然正确。
现在,我当然看到在阵列上操作时需要相互排斥&#34;可用&#34;在另一个方法acquireResource()中,以及指令
available[i] = true;
在相同的变量上运行,它更优雅,在概念上也更清晰,在互斥的情况下对它进行操作。另一方面,作为并发编程的初学者,我不认为在不需要的地方互相排斥是好的。
我是对的(指令可以在没有互斥的情况下执行)或者我错过了什么,删除互斥会导致一些问题?关于执行环境的最后一点说明:它可以是单处理器或多处理器,这意味着解决方案必须适用于这两种情况。谢谢你的帮助!