>source

이것은 학교 과제입니다. 피어 투 피어 스레드 모델을 만들려고합니다.

http://www.informit.com/articles/article.aspx?p=169479& 시퀀스 번호=5

<블록 인용>

위임 모델에 작업을 작업자 스레드에 위임하는 보스 스레드가 있는 경우 피어 투 피어 모델에서는 모든 스레드가 동일한 작업 상태를 갖습니다. 모든 작업을 수행하는 데 필요한 모든 스레드를 처음에 생성하는 단일 스레드가 있지만 해당 스레드는 작업자 스레드로 간주되며 위임하지 않습니다. 이 모델에는 중앙 집중식 스레드가 없습니다.

그래서 내 메인 쓰레드는 5개의 쓰레드를 생성할 것이고, 이 쓰레드는 내 큐를 듣기 시작하고 10초 동안 메인 쓰레드로 작업을 생성합니다. 그리고 모든 스레드가 작업을 수행해야 하므로 이 스레드도 작업을 기다려야 합니다. 어떻게 해야 하나요?

BlockingQueue<Job> queue= new ArrayBlockingQueue<Job>(1000);
    Collection<Thread> workers= new ArrayList<Thread>();
    for(int i= 0; i < 5; i++) {
        Thread thread= new Thread(new Worker(queue));
        workers.add(thread);
        thread.start();
    }
    long endTime= System.currentTimeMillis() + 10000;
    Random r= new Random();
    while(System.currentTimeMillis() < endTime) {
        try {
            CalculateJob job= new CalculateJob(r.nextInt(50), r.nextInt(50), r.nextInt(50));
            queue.put(job);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

그래서 내 메인 스레드는 스레드를 생성하는 작업을 하고 작업자는queue.take().

P2P 모델에서 모든 스레드가queue.take()또는 작업을 기다립니다. 그렇다면 어떻게 해야 합니까? 제안 사항이 있습니까?

당신은 이미 당신의 질문에 답변했습니다 :)

Amit Deshpande2021-09-18 18:58:59

@amitd 그래,하지만 "주"스레드가 새로운 일자리를 만들고 대기열에 추가 할 때, 어떻게 그 스레드로 작업을 완료 할 수 있습니까?

Jaanus2021-09-18 18:58:59

일단 하나의 작업자 스레드가 모든 작업을 생성하면 대기열에서 take ()를 호출 할 수 있습니다. 따라서 모든 노동자들은 큐에서 take ()를 호출합니다.

Amit Deshpande2021-09-18 18:58:59

예. 내 대답에서 말했듯이, 보스 스레드가 끝날 때까지 작업자가 작동하도록 차단하려면 카운트 다운 레이치를 사용할 수 있습니다. 모든 스레드는 래치에서 AWAIT ()를 호출하고 보스가 완료되면 게이트가 열리고 모든 스레드가 작업을 시작할 수 있습니다.

Amit Deshpande2021-09-18 18:58:59
  • 답변 # 1

    보스 피어 투 피어 의 유일한 차이점은 요청 (입력 ). 요청이 다른 유형이면 프로그램이 보스 모델이고, 요청이 동일한 것과 같은 보스 모델이 필요하다면, 우리는 보스가 필요하지 않고 피어 투 피어 모델.

  • 답변 # 2

    질문은 태그가 붙어 있지만 워크 클레프 모델 소리가 동시성의 일반적인 개념 인 것처럼 들리기 때문에 C.에 PSUEDO code를 추가합니다.

    피어 모델에서 워크 커크 모델이라고도하는 하나의 스레드가 있어야합니다. 프로그램이 시작될 때 다른 모든 피어 스레드를 만듭니다. 이 스레드 이후에 요청을 처리하는 또 다른 피어 스레드로 작동합니다. 또는 다른 동료들이 끝내기를 기다리는 자체를 일시 중지합니다. 피어 모델은 각 스레드를 자체 입력에 대해 책임을줍니다. 피어가 알고있다 그 자체의 시간은 미리 입력하고, 그 자체 개인적인 방법을 얻습니다. 입력하거나 다른 피어와 함께 입력 한 지점을 공유합니다.

    main()
    {
       pthread_create( ... thread1 ... task1 )
       pthread_create( ... thread2 ... task2 )
       .
       .
       .
       signal all workers to start
       wait for all workers to finish
       do any clean up
    }
    task1()
    {
       wait for start
       perform task, synchronize as needed if accessing shared resources
       done
    }
    task2()
    {
       wait for start
       perform task, synchronize as needed if accessing shared resources
       done
    }
    

    모든 출처는에서 인용됩니다 Pthreads 프로그래밍 -더 나은 다중 프로세싱, Buttlar, Farrell, Nichols를위한 POSIX 표준

  • 답변 # 3

    자체가 제공 한 기사를 제안하는 것으로

    피어 -투 -피어 모델에서 모든 스레드는 동일한 작업 상태를 갖습니다. 처음에는 모든 작업을 수행하는 데 필요한 모든 스레드가 처음 생성되는 단일 스레드가 있지만 그 스레드는 작업자 스레드로 간주되며 위임되지 않습니다.

    직원이 일어나는 상사 스레드는 대기열에 넣어 일자리를 창출하고 부름을 통해 작업자와 같이 작동 할 수 있습니다.가져 가다()일단 일자리를두면 일을 끝내면됩니다.

    이제 보스 스레드가 작업 작성을 완료 할 때까지 모든 스레드를 차단하려면 이제 사용할 수 있습니다.카운트 다운 레이트단일 수.

    이 모델이 생산자 /소비자 모델이 있거나 아닌이 모델이 있는지 여부를 알 수 없습니다.

  • 답변 # 4

    연결된 기사는 작업이 생성되는 방법을 말하지 않습니다. 그들은 아마도 그들이 다른 곳에서 창조된다는 것을 의미합니다. 해당 모델의 수치를보고 우리는 다음을 봅니다.

    • "위임 모델"에서 주 스레드는 작업 실이 작업을 수행 할 작업을 결정합니다.
    • "피어 -피어 모델"에서 피어 스레드는 공통 대기열에서 작동합니다 (그리고 어떤 스레드가 먼저 다음 작업을 가져옵니다)에서 일어나는 경우 피어 스레드가 스스로를 조정합니다.

    ConcurrentQueue를 사용하여 실제로 피어에 피어링 모델을 구현했습니다.

    요약하면 그들이 만든 구별은 스레드가 작업이 어떻게 작성되는지 아닌 작업을 조정하는 방법입니다.

  • 이전 JSON을 SWIFT로 변환하는 동안 "데이터가 올바른 형식이 아니기 때문에 데이터를 읽을 수 없었습니다."
  • 다음 c# : EF 코어 : ID를 동시에 기본 키와 외래 키로 사용