2012-06-14 3 views
2

2 개의 서로 다른 omp_lock_t를 만들고 서로 독립적으로 잠글 수 있다고 가정했습니다. 내가 GCC 4.4과 GCC 4.6.1와 코드의 다음 섹션을 시험하고 동일한 출력을 가지고 :OpenMP에서 omp_lock_t를 여러 개 사용할 수 있습니까?

omp_lock_t lockA; 
omp_lock_t lockB; 
omp_init_lock(&lockA); 
omp_init_lock(&lockB); 

std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n"; 
omp_set_lock(&lockA); 
std::cout << "Lock A set\n"; 
std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n"; 

omp_set_lock(&lockB); 
... 

이 코드는 다음과 같은 출력이 생성 한 후

Lock B is: 1 
Lock A set 
Lock B is: 0 

는 omp_set_lock에 교착 상태를 (& lockB) 시도.

두 개의 서로 다른 잠금을 만들고 독립적으로 사용할 수 있습니까? 가능한 경우 이러한 잠금을 설정하는 올바른 방법은 무엇입니까?

감사합니다.

답변

3

코드는 예상대로 작동합니다. 나는 당신이 무엇을 omp_test_lock에 대해 오해하고 있다고 가정하고 있습니다. (특히 이름은 매우 오도 된 것 같습니다.)

omp_test_lock은 잠금 장치을 얻으려고합니다. 그러나 omp_set_lock이 아니면 잠금을 성공적으로 획득 할 때까지 차단되지 않습니다. 그러나 그것이 유일한 차이점입니다. 특히, 첫 번째 "테스트"(단지 테스트는 아님) 이후에 lockB이 획득되었으므로 두 번째 "테스트"가 실패하고 그 다음에 omp_set_lock(&lockB) 교착 상태가 발생하는 이유가 여기에 해당됩니다.

예 : 예, 은 여러 개의 잠금 장치를 사용합니다.

omp_lock_t lockA; 
omp_lock_t lockB; 
omp_init_lock(&lockA); 
omp_init_lock(&lockB); 

omp_set_lock(&lockA); 
std::cout << "Lock A set\n"; 
omp_set_lock(&lockB); 
std::cout << "Lock B set\n"; 
… 

이 코드는 교착 상태가 아닙니다.

+0

대단히 감사합니다. 이렇게하면 모든 것이 완전히 지워집니다. – selecsosi

관련 문제