仅使用共享内存

时间:2016-12-15 09:22:49

标签: multithreading locking

最近,我在几家公司接受了采访,并被问到同样的问题:

“你有N个工作线程只能通过共享内存进行通信,任何其他同步原语都不可用。共享内存包含一个最初为0的计数器,每个线程必须递增一次。另一个线程可能是添加了,除了计数器“

之外,共享内存上还有更多空间

换句话说,有多个线程,并且它们对共享资源的访问权限(在这种情况下,计数器,但可以是其他任何东西)必须仅使用共享内存进行同步。

所以我的解决方案如下:

  1. 在共享内存上定义另外3个整数变量:REQUEST,GRANTED,FINISHED,并将它们初始化为-1。
  2. 在启动工作线程之前,启动另一个将在工作线程之间进行协调的管理器线程。
  3. Manager线程伪代码:

    while (true) {
        if(GRANTED equals FINISHED) {
            GRANTED = REQUEST;
        }
    }
    
    1. 工作线程伪代码:

      incremented = false; 
      while (incremented equals false) {
          REQUEST = this thread ID;
          if(GRANTED equals this thread ID) {
              increment the counter;
              incremented = true;
              FINISHED = this thread ID;
          }
      }
      
    2. 问题是这个解决方案是否正常? 还有其他解决方案吗? 此外,这种解决方案不公平,因为工人可能会多次尝试,直到有机会实际增加计数器。如何公平?

0 个答案:

没有答案