2016-12-08 7 views
0

C++로 문제를 해결하는 방법을 찾고 있습니다.그 중 하나가 이전에 종료되었을 때 모든 스레드를 종료하십시오. С ++

자세한 설명 (간단한 설명은 다음과 같습니다) :

나는 스도쿠 솔버를 쓰고 있어요. 나는 이미 bruteforce 메서드를 만들었으며 (어떤 행이 동일한 행, 열 및 사각형에서 이미 사용되었는지 확인) 이제는 "경험적"다중 스레드 메서드를 사용하려고합니다. 이 경험적 방법은 프로그램이 가능한 값이 1보다 큰 셀을 발견하면이 셀에 가능한 첫 번째 값을두고 해당 셀에서 bruteforce를 시도한다는 것을 의미합니다. 그것이 우익으로 인도한다면! 없으면이 셀에 대해 가능한 두 번째 값을 시도합니다. 그리고 가능한 값의 배열이 끝나기 전에 계속됩니다. 그런 다음 두 번째 빈 셀 등을 사용하여 동일한 작업을 시도합니다. '다중 스레드'에서 첫 번째 스레드는 첫 번째 빈 셀에서 시작하여이 알고리즘을 실행하고 두 번째 스레드는 두 번째 빈 셀에서 시작합니다. 그래서이 문제는 다음과 같습니다

간략한 설명 : 나는 N 스레드를 만들려면, 그리고 그들 각각의 적합한 솔루션을 찾아 주 스레드로 다시 돌아 동일한 확률을 가지고

(또는 쓰기 그것은 주 스레드에서 기다리고있는 초기 변수에 대한 참조에 의해). 그 중 하나가 나에게 (나 == 메인 스레드) 그것이 해결책을 찾았다 고 말하면 모든 스레드를 멈추는 방법을 찾고 있습니다.

감사합니다.

P. 알고리즘 개선 방법에 대한 아이디어가 있으시면 언제든지 알려 주시면 감사하겠습니다.

UPD 만 GNU/리눅스에 실행

+0

스레드에 대해 배울 때 뮤텍스와 조건 변수에 대해서도 배워야합니다. 이 경우 뮤텍스를 보호하는 간단한 'bool'만으로도 충분합니다. –

+1

에는 foundSolution이라는 부울 변수가 있습니다. 각 스레드가 주 루프에서 매번 설정되는지 확인하려고합니다. – pm100

+0

아마도 [std :: atomic_bool] (http://en.cppreference.com/w/cpp/atomic/ 원자) 여기 유용 할 것입니다. – Galik

답변

0

이것에 대해 갈 일반적으로 두 가지 방법이 있습니다.

한 가지 방법은 플래그를 사용하고 주기적으로 플래그를 폴링하는 것입니다. 그렇게 할 수있는 "안전한"방법은

std::atomic<bool> complete; 

// In your thread, when you find a solution… 
complete.store(true); 

// In your thread, when you want to know if another thread found a solution… 
if (complete.load()) { 
    // return early 
} 

훨씬 더 어려운 두 번째 방법은, 하나의 작업자가 솔루션을 발견하면 실제로 근로자를 죽일 것입니다, 원자 사용하는 것입니다. 이렇게하는 유일한 합리적인 안전한 방법은 각 프로세스를 자체 프로세스에서 실행하고 솔루션이 발견되면 각 작업자 프로세스를 종료하는 것입니다.

+0

"완료"는 주 스레드에서 선언해야합니다 ? –

+0

@ArtemKelpe 모든 응용 프로그램에서 싱글 톤 (singleton)이있는 한 어디서나 사용할 수 있습니다. 예를 들어 SudokuSolver 클래스의 정적 멤버입니다. –

+0

@ArtemKelpe : 위 코드는 단편입니다. 같은 문제에 대해 작업하는 모든 스레드간에 하나의 변수를 공유하도록하십시오. –