2013-07-18 2 views
1

C++ 11에서는 알고리즘이 std::random_shuffle (두 개의 다른 컨테이너에서 두 개의 다른 스레드에 의해 호출 될 때) 스레드 안전합니까? std :: random_shuffle 스레드는 안전합니까?

특히이 형태

: 그것은 스레드 안전 난수 발생기를 사용하는 경우

template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last); 
+2

'std :: random_shuffle'의 오버로드로 인해 아마도'global :: std :: rand()'가 호출 될 가능성이 있습니다. – juanchopanza

답변

5

해당 함수의 두 가지 동시 실행이 동일한 데이터에서 "작동"하지 않으면 함수는 스레드 안전입니다. 여기에서 "작업"은 함수가 비 원자적이고 일관성없는 방식으로 데이터를 수정할 수 없음을 의미합니다. 데이터가 기능에 액세스 할 수있는 방법은 세 가지가 있습니다 : 이러한 매개 변수에 의해 멤버 함수는

  • 기능 정적 클래스 정적에 호출되는 객체를 통해
  • 를 참조 객체를 포함하는 함수 매개 변수를 통해

    1. 간접적으로 호출되는 함수가 사용하는 데이터를 포함하여 전역 데이터를 포함합니다.

    random_shuffle은 무료 기능이므로 2.은 적용되지 않습니다. 그러나 함수에는 매개 변수가 있으며 기본 시퀀스의 내용이 변경된다는 의미에서 매개 변수에 작용합니다. 그러나 동시 호출이 겹치는 시퀀스에서 작동하지 않으면 아무런 문제가 없습니다.

    정적/전역 데이터를 남깁니다. 대부분의 randum 번호 생성기는 시드에 대해 일종의 전역 데이터를 사용합니다. 기본 무작위 기능 rand은 스레드 세이프 일 필요가 없으며 해당 글로벌 시드에 대한 액세스를 명시 적으로 동기화하지 않습니다.

    따라서 귀하의 경우 아니요, 난수 생성기가 아닌 경우 스레드 안전이 아닙니다.

    동시 호출시 서로 다른 생성기를 사용하는 임의 번호 생성기의 동기화 된 버전을 쓸 수도 있습니다. 나는 후자를 선호하기 때문에 동시 셔플은 서로의 난수 시퀀스를 방해하지 않습니다. (그러나 나는 결코 난수 생성의 전문가는 아니다.)

  • +0

    'rqnd'는 스레드로부터 안전해야 **합니다 **. ** thread-safe가 아닌 **이라고 말하는 것과 같지 않습니다. 어떤 특정 구현 **은 ** 스레드로부터 안전하게 할 수 있으며, 그 문서는 그것을 알려줄 것입니다. –

    +0

    @PeteBecker * 일 필요는 없습니다. * 표준 C++에서는 threadsafe가 아님을 의미합니다. 특정 구현이 표준 요구보다 많은 보증을 제공하는 경우 이는 표준 확장입니다. 대답은 일반적인 언어 질문에 대한 것이지 특정 구현에 대한 것이 아닙니다. 표준이 명시 적으로 확장을 허용하기 때문에 언어에 거의 모든 구석에 적용되기 때문에 "특정 컴파일러에서 더 좋을 수도 있습니다"를 추가하는 것은 불필요합니다. 그러나 나는'rand'에 관한 문구를 조금 바꿀 것이다 :-) –

    3

    이는 스레드 안전하다. 생성자는 구현에 따라 정의됩니다 (또한 std::rand을 사용하는 경우 구현이 안전한지 여부는 구현에 따라 정의 됨). 따라서 사용중인 구현에 대한 설명서를 참조해야합니다.

    확실히 다른 스레드 변형을 사용하거나 각 스레드에 대해 별도의 생성기를 제공해야합니다.

    관련 문제