2010-06-30 4 views
0

전 세계적으로 여러 변수를 저장하는 간단한 서버를 만들고 있습니다. 경우에 따라 이러한 변수가 업데이트되고이 시간 동안 변수는 다른 스레드에서 잠 깁니다. 서버에 액세스하는 각 클라이언트는 자체 스레드가 부여되지만 이러한 변수를 변경할 방법이 없으며 기본적으로 읽기 전용입니다. 인터넷에 대한 나의 질문은 내가 (a) 두 스레드가 같은 변수를 동시에 읽거나 (변경하지 않음) 또는 b) 가변 프로세스를 작성하여 읽기 프로세스를 방해하는 것입니다.linux에서 double 연산을 읽고 있습니까?

대부분의 경우 double을 쓰는 것은 일반적으로 하나 이상의 레지스터이기 때문에 원자 연산이 아니지만 읽기 작업을 중단 할 수 있습니까?

감사

+3

어떤 아키텍처 (x86, AMD64 등)? –

+2

"(아무것도하지 말고 동기화 프리미티브를 호출하는) 원자력 작업이 무엇이든간에"대답은? 보통 "아니오"입니다. –

+0

가능한 복제본 [Double update atomic] (http://stackoverflow.com/questions/1292786/is-updating-double-operation-atomic) – Suma

답변

3

내 첫번째 추측이이 OS로 리눅스와는 아무 상관이 없다는 것입니다.

일부 CPU는 1 회의 작업에서 메모리에 두 번로드/저장할 수 있기 때문에 사용중인 CPU와 관련이 있습니다. x86 시리즈는 FPU 용 연산 코드를 가지고 있습니다.

또한이 CPU 기능을 사용하여 1 작업에서 두 ​​배를로드/저장하는 컴파일러에 연결할 수 있습니다. gcc가하는 일을 모른다.

+1

나는 아키텍쳐에 의존하고 OS 독립적이라고 생각한다. Linux는 답을 알지 못하거나 신경 쓰지 않으며 그 차이를 만들어 내지 못합니다. – MarkR

+1

간단하지 않습니다. 아키텍처는 원자 적로드 만 수행 할 수 있습니다. 나는 x86이 그런 시스템이라고 생각한다. 그런 다음 정렬 된 주소에서만 복식을 저장하는 것은 OS와 컴파일러의 책임입니다. malloc()이 sizeof (double)로 정렬 된 주소를 반환하는지 확인합니다. – MSalters

0

독서 인 경우 인 경우 원자력에 대해 걱정하지 않아도됩니다. 읽고 쓰는 중이라면 "서버"와 "클라이언트"스레드에서 뮤텍스 잠금을 사용해야합니다. 쓰기 만 할 때 잠그면 작업의 절반이 완료됩니다.

이제는 단일 더블로 컴파일러의 작업과 정확한 하드웨어 아키텍처에 따라 약간의 행운을 겪을 수 있습니다. this answer을 참조하십시오.

+0

그것은 다소 요점입니다. 물론 명시 적으로 잠금으로써 작업을 원자 적으로 만들 수 있습니다. 명시 적 잠금은 매우 비용이 많이 드는 작업이지만 특정 작업의 경우이를 사용하지 않고 훨씬 더 효율적으로 작업 할 수 있습니다. 원자 값은 그러한 메소드의 전제 조건입니다. –

+0

제출자가 자신의 질문에 명시 적으로 언급하지 않았다면 요점의 옆에있을 것입니다! "때로는 이러한 변수가 업데이트되고이 시간 동안 변수는 다른 스레드 [...]에서 잠겨집니다. 원자 업데이트에 관한 한, 내가 링크 된 기존 답변에는 여기에 대한 자세한 내용이 있습니다. – xcut

1

[편집] 죄송 합니다만,이 질문을 처음 읽었을 때 나는 빠져 있었고, 제프가 친절하게 지적한 잘못된 대답을했습니다.

나는 그것이 일반적으로 더 하나 개 레지스터보다이지만, 읽기 작업이 중단 될 수 있기 때문에 대부분의 경우 더블을 작성하는 원자 조작 이 아님을 알아?

예. 두 개의 WORD 크기의 변수를 사용하여 자신의 IEEE 배정 밀도 부동 유형을 작성하려고한다고 상상해보십시오. 우리는이 둘을 원자 적으로 읽을 수는 없습니다. 우리가 읽으려고 노력하는 동시에 동시에 수정 될 수 있습니다.

내가 걱정해야합니까 중 하나) 에서 동시에 (변경) 또는 B) 읽기 프로세스를 중단 변수 처리 를 작성하지를 같은 변수를 읽고 두 스레드.

A : 아니요

B : 네

당신이 나 같은 경우는, (작가 이외에) 독자를위한 동기화 메커니즘을 사용해야하거나 것 중 하나, 바로 현대 시스템에서 읽기 위해 원자적일 수있는 공유 데이터 용 WORD 크기의 단 정밀도 부동 소수점으로 지정하고 (확인해야하지만) 원자 연산을 수정하여 두통을 피하십시오.

+2

원 자성은 읽기에도 적용됩니다. double의 첫 번째 단어를 읽은 다음, (원자) 쓰기가 전체 double을 업데이트하고 두 번째 단어를 읽었다 고 가정 해 보겠습니다. 그건 원자가 아니야. 'int'의 읽기는 일반적으로 원자 적입니다. 그것은 한 번의 조작으로 발생하며 심하게 시간 초과 된 쓰기로 왜곡 될 수 없습니다. – jalf

+0

@jalf 네 말이 맞아. 나는 이것을 매우 조잡하고 잘못 말 하였다. 내가 말했어야 할 것은 "만약 당신이 단지 동시에 읽고 쓰는 것이 아니라면, 당신은 원자 적 조작에 대해 걱정할 필요가 없다"는 것입니다. 그에 따라이 게시물을 수정합니다. – stinky472

+0

+1 이제 좋아 보인다. –

관련 문제