2013-08-12 4 views
-2

예를 들어 이전 스레드가 완료 될 때까지 각 스레드가 실행되지 않기를 바란다. thread.isRunning()과 같은 플래그가 있습니까?스레드를 동시에 실행하는 대신 순차적으로 실행하는 방법은 무엇입니까?

내가 스레드가 동시에 실행하기위한 것입니다 알고
#include <iostream> 
#include <vector> 
#include <thread> 
using namespace std; 

void hello() { 
    cout << "thread id: " << this_thread::get_id() << endl; 
} 

int main() { 

    vector<thread> threads; 

    for (int i = 0; i < 5; ++i) 
     threads.push_back(thread(hello)); 


    for (thread& thr : threads) 
     thr.join(); 

    cin.get(); 
    return 0; 
} 

하지만 제가 순서를 제어 할 경우?

+6

XY 문제와 유사합니다. 주문을 왜 통제하고 싶습니까? 당신의 유스 케이스는 무엇입니까? –

+6

다른 스레드가 끝날 때까지 하나의 스레드를 실행하지 않으려면 스레드를 원하지 않을 것입니다. 하나씩 다른 함수 호출을 작성하십시오. –

+1

이 질문은 '동시 작업이 순차적으로 실행되도록 설계된 것을 어떻게 만들 수 있습니까?'라는 것이 너무 자주 나타납니다. –

답변

1

첫 번째 스레드가 완료된 후에 두 번째 스레드가 시작되어야한다면 스레드가 실제로 필요합니까?

글로벌 플래그를 설정하려고하면 첫 번째 스레드에서 값을 설정하고 두 번째 스레드를 시작할 때 먼저 플래그가 작동하는지 확인하십시오.

+1

그러나 그저 까다 롭습니다. 모든 스레드가 계속 실행되고 있으며, 단지 조건이 발생하기를 기다리고 있습니다. 그럼에도 불구하고 - 그들은 실행 중입니다 (즉, 스케쥴러에서 스케줄링된다는 의미에서). 그러나 다른 해결책은 없습니다. –

+0

여러 작업이이 작업을 대기하는 경우. 첫 번째 작업을 완료 한 후 스레드를 작성하지 않는 이유는 무엇입니까? 그것을 실에 넣지 마십시오. –

+1

CPU 집중 플래그 폴링은 적절한 대답입니까? –

3

thread.isRunning()은 없습니다. 이를 수행하려면 약간의 동기화 프리미티브가 필요합니다. 예를 들어 std::condition_variable을 고려하십시오.

2

"먼저, 스레드 1, 스레드 2, ..."와 같이 순서를 제어 할 수 없다면 동기화 (즉, std::mutex 및 조건 변수 std::condition_variable_any)를 사용해야합니다.
특정 이벤트가 발생할 때까지 하나의 스레드를 차단하도록 이벤트를 작성할 수 있습니다.

C++ - 11의 스레딩 메커니즘에 대한 개요는 cppreference을 참조하십시오.

0

세마포어 또는 잠금을 사용해야합니다.
0을 가치를 세마포를 초기화 할 경우 thread.start 후
통화 대기()와 스레드 실행 함수의 끝에서 신호/해제 전화 (자바 예를 들어, 실행 funcition,의 OnExit 기능 등 ...)

따라서 메인 쓰레드는 루프 내의 쓰레드가 실행을 완료 할 때까지 기다리게 될 것입니다.

3

하나의 접근 가능한 방법은 std::async을 사용하는 것입니다. std::async의 현재 정의에서 std :: async에 의해 시작된 작업의 연관된 상태로 인해 작업이 완료 될 때까지 반환 된 std::future의 소멸자가 차단 될 수 있습니다. 이로 인해 합성 가능성이 제한 될 수 있으며 결과는 병렬로 실행되지만 실제로는 순차적으로 실행됩니다.

{ 
    std::async(std::launch::async, []{ hello(); }); 
    std::async(std::launch::async, []{ hello(); }); // does not run until hello() completes 
} 
0

작업 기반 병렬이를 달성 할 수 있지만, C++은 현재이 라이브러리를 스레딩 것의 일환으로 작업 모델을 제공하지 않습니다. TBB 또는 PPL을 가지고 있다면 그들의 업무 기반 시설을 사용할 수 있습니다.

관련 문제