使用信号量

时间:2016-10-28 21:06:54

标签: multithreading semaphore critical-section mutual-exclusion

我对并发编程问题存有疑问。 更具体地说,我们正在使用共享内存模型(即线程)。问题是:给定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;

在相同的变量上运行,它更优雅,在概念上也更清晰,在互斥的情况下对它进行操作。另一方面,作为并发编程的初学者,我不认为在不需要的地方互相排斥是好的。

我是对的(指令可以在没有互斥的情况下执行)或者我错过了什么,删除互斥会导致一些问题?关于执行环境的最后一点说明:它可以是单处理器或多处理器,这意味着解决方案必须适用于这两种情况。谢谢你的帮助!

0 个答案:

没有答案