2012-02-21 7 views
0

인사말 !!mutex를 사용하지 않고 double var를 보호하십시오.

나는 POSIX 멀티 스레딩 응용 프로그램, 스레드 1에 , 나는 이런 식으로 글로벌 VAR 설정 리눅스에서 실행되는 교류 AP했습니다 : thread2에서

Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++) 
{ 
     Data1[idx].doubleval = idx * 100.0 * anothervar ; 
}//for 
Pthread_mutex_unlock(&Mutex1); 

을,이 방법으로 글로벌 var에 그것을 얻을 : 데이터 1을 thread1 설정되어있는 경우 지금

Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++) 
{ 
    doublexxx = Data1[idx].doubleval ; 
    DoSomething(doublexxx) ; 
}//for 
Pthread_mutex_unlock(&Mutex1); 

, 내 AP에 뮤텍스를 사용하지 않는 가정 [33] .doubleval thread2는 데이터 1을 읽는 동안 [33] .doubleval, 윌 데이터 1 [33]. doubleval은 매우 이상한 값입니까? 예를 들어 double var에는 4 바이트가 있고 thread1은 Data1 [33] .doubleval 첫 번째 2 바이트를 설정하고 나중에 2 바이트를 마칩니다. thread2가 Data1 [33] .doubleval ...을 읽으려고합니다. 가능하니?

이런 종류의 문제없이 이중 var를 보호하려면 어떻게해야합니까? 뮤텍스를 사용하는 것이 좋습니다, 나는 double var를 보호하는 또 다른 방법이 있는지 궁금합니다 thread1이 쓰고 있습니다. 적어도 thread2는 동일한 var에서 읽으려고합니다. 4 바이트를 두 번 기다리십시오 !!!

+1

뮤텍스를 사용하면 걱정할 필요가 없습니다. 불필요하게 문제를 일으키지 않는 이유는 무엇입니까? –

+0

심각하게; 잠그고 싶지 않으면 스레드를 사용하지 않아야합니다. – tbert

+0

고마워요, 내 응용 프로그램이 너무 많은 스레드를 사용하고, 가능한 한 빨리 실행하고 싶습니다, 어떻게 mutex_lock 효과 성능, 실제로 모든 뮤텍스 작은 메모리 strcpy 블록에서 사용되는,하지만 난 여전히 그것은 더 빨리 달립니다 ... 친절하게 모든 답장을 보내 주셔서 감사합니다 !! – barfatchen

답변

1

"부분적으로 쓰는"값을 읽을 수 있는지 여부는 많은 요인 (예 : 대상 시스템 및 정렬)에 따라 다르며 이식 할 수없는 경우가 많습니다. 예를 들어, 소프트웨어에서 에뮬레이트 된 부동 소수점 지원 기능이있는 16 비트 CPU에서 실행되는이 코드를 상상해보십시오.

뮤텍스를 사용하더라도 두 번째 스레드의 동작은 첫 번째 스레드가 데이터를 썼는지 또는 첫 번째 스레드가 데이터를 쓴 후에 데이터를 읽었는지 알 수 없기 때문에 여전히 정의되지 않습니다.

귀하의 디자인에 더 높은 수준의 문제가 있다고 의심됩니다. 아마도 첫 번째 스레드가 작성 될 때까지 두 번째 스레드를 대기 상태로 만들기 위해 조건 변수를 사용해야합니다.

또한 뮤텍스 제거에 대한 이유는 확장 성과 성능을 향상시키는 데 있다고 생각됩니다. 예를 들어, 한 스레드가 배열의 한 부분을 사용하고 다른 스레드가 같은 배열의 완전히 다른 부분을 수정하도록합니다. 이것이 당신의 질문에 대한 이유라면, 솔루션은 당신의 시나리오에 달려 있습니다 - 다중 잠금 (배열 영역 당 하나의 뮤텍스, 항목 당 하나의 뮤텍스까지)을 사용하는 것처럼 간단 할 수도 있지만 "독자를 구현할 수도 있습니다/writer "락 (다른 thread가 쓰고 있지 않는 한, 복수의 thread가 동시에 배열로부터 읽어 낼 수가 있습니다).

+0

고마워요 ... Thread1 무한 루프에서 데이터를 쓰고, 또한 무한 루프에서 데이터를 읽는 Thread2, 내 목표는 thread2가 이상한 값을 얻지 않을 것입니다 더 많은 성능을 얻을 것입니다, 그 값은 아무리 문제가 올바른 값입니다 thread1 빨리 또는 느린 쓰기 및 뮤텍스를 사용하지 않습니다 ... 때문에 thread2 합리적인 값을 최대한 빨리 필요하기 때문에, 가장 두려워 스레드 2 스레드 2, 쓸모없는 값을 읽습니다. 나중에 2 바이트에서 그런 식으로 뭔가 ... – barfatchen

1

걱정할 문제는 쓰기 도중에 읽을 가치가 없다는 것입니다. 나는 이것이 가능한 시스템을 모른다. 문제는 두 번째 스레드의 동작이 정의되지 않을 것입니다. 왜냐하면 첫 번째 스레드가 주어진 메모리 섹션에 쓰기 전이나 후에 읽을 지 여부를 모르기 때문입니다. 뮤텍스가 없거나 기능적으로 동일한 것이 없다면 잘 정의 된 동작을 얻을 수있는 방법이 없습니다.

+0

워드 프로세서는 알파 프로세서에서 확실히 발생할 수 있습니다. x86 CPU에서는 컴파일러가 재미있는 일을하지 않는다고 가정 할 때 정렬되지 않은 액세스에서만 발생할 수 있다고 생각합니다.(예를 들어, GCC는 값을 변경하지 않아도 값을 읽은 후에 메모리에 다시 값을 쓰는 경우가 있는데, 다른 스레드의 쓰기가 손실 될 수 있습니다.) –

+0

thread2는 항상 전역 double var g1, thread1은 항상 쓰고,이 2 개의 스레드는 둘 다 무한 루프에 있습니다. g1이 1.55이면 thread1은 g1 = 1.66을 실행하려고합니다. thread2가 뮤텍스가없는 동일한 monent에서 g1을 읽으 려한다면 확실히 할 수 있습니다. g1 = 1.55 또는 1.66이어야하며, 가능한 다른 값은 없습니다. 그러면 뮤텍스를 피할 것입니다! – barfatchen

관련 문제