2011-03-03 5 views
1

wait(), notify() 또는 synchronize을 사용하지 않고 Java에서 초보자 세마포어를 구현하는 방법을 알고있는 사람이 있습니까?이 문제에 대한 해결책을 찾고 있지 않습니다. 올바른 방향의 포인터 일뿐입니다. 이걸 잃어 버렸어.자바에서 세마포어

+0

이 일의 요점은 무엇입니까? –

+0

과제 태그가 누락 되었습니까? –

+5

wait(), notify() 등보다 기초적인 접근 방법을 원한다면 c와 같이 언어를 좀 더 낮은 수준으로 변경하는 것을 고려해야합니다. – bluefoot

답변

0

을 도움이되기를 바랍니다.

부여 프로세스 전에 int 또는 boolean을 테스트하십시오. 0 (부울 값어귀)이면 1을 더하고 계속하십시오. 그렇지 않은 경우 Thread.yield()를 다시 실행하십시오. 놓을 때 int에서 1을 제거하고 계속하십시오.

순진한 구현이지만 제대로 작동합니다.

1

몇 년 전에 나의 대학에서 비슷한 숙제를했지만 C++. Java는 이런 종류의 물건에 너무 높은 수준의 언어입니다.

여기 신호 및 C++에서 기다리는 내 구현하지만 다른 것들을 많이 구현해야하기 때문에 도움이 될 경우 나도 몰라.

int KernelSem::wait() { 
    lock(); 
    if(--value < 0) { 
     PCB::running->state = PCB::BLOCKED; 
     PCB::running->waitingAtSem = this; 
     blockedQueue->put(PCB::running); 
     dispatch(); 
    } 
    else { 
     PCB::running->deblockedBy = 0; 
     if(semPreempt) dispatch(); 
    } 
    unlock(); 
    return PCB::running->deblockedBy; 
} 


void KernelSem::signal() { 
    lock(); 
    if(value++ < 0) { 
     PCB* tempPCB = blockedQueue->get(); 
     if(tempPCB) { 
      tempPCB->state = PCB::READY; 
      tempPCB->deblockedBy = 0; 
      tempPCB->waitingAtSem = 0; 
      Scheduler::put(tempPCB); 
     } 
    } 
    if(semPreempt) dispatch(); 
    unlock(); 
} 

잠금 및 잠금 해제 기능은 asm{cli}asm{sti} (일반/설정 인터럽트 플래그)입니다. PCB 번호는 process control block입니다.

는 (다시) 간단한 방법은 간단한 INT 또는 부울을 사용하여이 구현할 수 그것은 매우 간단 간단한에

0

허용 된 답변에서 제안한대로하는 것은 상호 배제를 보장 할 수 없으므로 동시에 많은 문제가 발생할 수 있습니다. 예를 들어, 정수를 증가 시키려고하는 두 개의 스레드는 동시에 (즉 잠금으로 제안 된) 부울을 읽은 다음 두 가지 모두 괜찮다고 생각하고 둘 다 부울을 반대 값으로 설정합니다. 두 스레드는 변경 작업을 수행하고 완료되면 (비) 상호 배타적 인 변수에 값을 쓰게되고 세마포어의 전체 목적이 손실됩니다. wait() 메소드는 어떤 일이 생길 때까지 기다리는 것을위한 것이고, 당신이하고 싶은 일이다.

절대적으로 wait를 사용하지 않으려면 스레드가 먼저 lock 변수를 확인하고 false로 변경하고 배열이나 특정 슬롯이있는 플래그를 설정하는 몇 가지 종류의 이중 검사 절전 기술을 구현하십시오 그 스레드가 항상 성공할 수 있도록하기 위해서입니다. 그런 다음 스레드는 작은 시간 간격 동안 잠자기 상태가되고 다른 배열이 같은 시간에 있는지보기 위해 전체 배열을 검사합니다. 그렇지 않다면, 계속 진행할 수 있습니다. 그렇지 않으면 계속할 수없고 다시 시도하기 전에 임의의 시간 동안 잠을 자야합니다 (나중에 누군가 성공할 수 있도록 스레드가 잠자기 상태가되도록). 그들이 다시 무너지면 그들은 더 긴 시간 동안 잠을 자게됩니다. 이 기술은 세마포어를 사용할 수없는 네트워크에서도 사용됩니다.

(물론 세마포어의 당신이 원하는하지만 기다릴 사용하기 때문에 내가 가지 ... 전혀 기다릴 사용하지 않는 무언가를 원하는 가정 정확히)