2015-01-17 5 views
1

보조 프로세서가 수정할 수있는 메모리가 있습니다. 내가 그것에 내 포인터를 휘발성으로 표시했습니다,하지만 그 메모리를 fwrite에서 소스로 사용한다면 리눅스 캐싱 (커널이 코 프로세서가 그 위치에서 데이터를 변경 한 후까지 복사를 연기 함) 또는 다른 것에 대해 걱정해야합니다 ? 예를 들어C - volatile 소스의 fwrite()

:

volatile My_Data_t* samples; 
fwrite((void *) samples, 4, 1, fp); 
+0

[write (2)'] (http://linux.die.net/man/2/write)와 달리'fwrite'는 C 표준 라이브러리에서 더 버퍼링 될 수 있습니다. – 5gon12eder

+0

버퍼링 된 I/O를 사용하면 플러시 전에 다른 배열에 복사본이 만들어졌습니다. 그래도 문제는 해결되지 않습니다. 'write'는'fwrite'보다 동시성 문제에서이 호출을 더 이상 안전하게하지 않습니다. – selbie

답변

5

짧은 대답은 "예"입니다.

volatile 동시 처리 문제에 추가 보호 기능을 추가하지 않습니다. 컴파일러는 연속 액세스간에 레지스터의 내용을 캐시하지 않는 것이 좋습니다.

My_Data_t 유형의 레이아웃을 모르지만 한 번에 4 개 이상을 작성하고 있습니다. 코 프로세서가 언제든지이 배열을 수정할 수 있다고 말하면 fwrite 호출 중에 배열의 항목 중 일부가 수정 될 가능성이 높습니다.

귀하의 보조 프로세서는 "잠금 장치"메커니즘을 존중할 수 있습니까? 그것은 궁극적으로 당신이 필요로하는 것입니다.

+0

코 프로세서는 잠금을 존중할 수 있습니다. 'fwrite'가 반환 될 때까지 메모리를 잠그면 안전합니까? – ipburbank

+1

** ** 두 스레드가'samples '의 내용을 액세스하거나 변경할 때 잠금을 취하는 한. 그러므로 lock이없는 경우'fwrite' 호출을 lock/unlock으로 랩핑하고 코 프로세서가'samples'에 쓰려고하지 않으면 ok입니다. – selbie