2010-05-17 9 views
3

Linux (C/C++ & POSIX 스레드)에서 다중 스레드 프로그래밍에 대한 경험이 있지만 대부분의 경우는 매우 복잡합니다.C에서 다중 스레드의 정적 상수 변수에 액세스

내 정적 변수 (전역 및 함수 로컬)가 내 코드에 있는데, 뮤텍스를 사용하지 않고 여러 스레드에서 동시에 액세스 할 수 있습니까? 나는 그것들을 수정하지 않기 때문에 괜찮을 것이다. 그러나 항상 물어 보는 것이 더 좋다.

무거운 속도 최적화를 수행해야하므로 뮤텍스 잠금/잠금 해제와 같은 빠른 작업을하더라도 내 응용 프로그램이 이러한 변수에 액세스 할 때 긴 루프를 사용하기 때문에 비용이 많이 든다.

+1

내 이전 질문의 속보처럼 보입니다. http://stackoverflow.com/questions/2762803/thread-safety-of-read-only-memory-access, 답변은 잠금없이 정적 데이터에 액세스하는 것이 안전하다는 것입니다. – Edmund

답변

4

만 읽고 당신이 어떤 잠금

13

당신은 단지 하나 개의 스레드를 그들에 초기화 한 후이없이 여러 스레드에서 동시에 읽을 수 확인을해야,이를 수정하지 않을 경우를 필요가 없습니다 수정하지 않는 경우 뮤텍스 등.

+5

+1, 답변에서 분명하지 않은 경우 : 상수 정적 변수가있는 함수에 대한 첫 번째 호출은 스레드로부터 안전하지 않습니다. –

+0

@David : 사실 대부분의 컴파일러는 double-check locking을 사용하고 function-scope static 변수의 초기화를 동기화합니다. 예를 들어, gcc는 전적으로 안전합니다. –

0

다른 인텔 아키텍처에 대해서는 잘 모르지만, 인텔은 모든 읽기가 원 자성을 보장하지만, 일부를 추가하려는 느낌이 들면 value = atomic_add(&variable,0);과 같은 것을 사용하면 모든 쓰기가 강제로 수행되고 0을 추가합니다. 값은 변경되지 않는 이전 값을 반환합니다.

+0

알아두면 좋겠지 만, 모든 읽기는 원 자성입니다.이 정보의 출처를 알려주시겠습니까? – Goofy

관련 문제