delphi에서 모든 것을 안전하고 안전하게 처리 할 수 있습니다. 다른 사람들은 부울에 정렬 문제를 언급하는 반면에 이것은 실제 문제를 숨 깁니다.
예. 모든 스레드에서 부울을 읽을 수 있으며 올바르게 정렬 된 경우 모든 스레드에서 부울에 쓸 수 있습니다. 하지만 변경 한 부울에서 읽는 것이 어쨌든 "스레드 안전"일 필요는 없습니다. 다른 스레드가 숫자를 읽도록 숫자를 업데이트 한 경우 true로 설정된 부울 값이 있다고합시다.
if NumberUpdated then
begin
LocalNumber = TheNumber;
end;
때문에 최적화에 프로세서 따라서 당신은 당신이 마지막으로 NumberUpdated 업데이트에 있는데도 TheNumber의 이전 값을 얻을 수 NumberUpdated 읽기 전에 TheNumber를 읽을 수 있습니다.
아카, 당신의 코드가 될 수 있습니다 :
temp = TheNumber;
if NumberUpdated the
begin
LocalNumber = temp;
end;
이럴, 엄지 손가락의 기본 규칙 :
는 ".. 읽어 스레드 안전 쓰기가 스레드 안전하지 않습니다"
따라서 쓰기를 수행하려는 경우 모든 곳에서의 값을 읽으면 값을 읽을 수 있고 이면이 될 수 있습니다.
한편, 하나의 스레드에서만 값을 읽고 쓰면 스레드로부터 안전합니다. 따라서 임시 위치에 많은 양의 쓰기 작업을 수행 한 다음 응용 프로그램 전체 데이터의 업데이트를 동기화 할 수 있습니다.
보너스 광고 :
VCL은 스레드로부터 안전하지 않습니다. 주 스레드에서 UI의 모든 수정을 유지하십시오. 주 스레드에 모든 ui 항목의 생성도 유지하십시오.
많은 기능이 스레드 안전도 아니지만 다른 기능은 기본 winapi 호출에 의존하는 경우가 많습니다.
"목록 안전성"이 많은 것을 의미 할 수 있으므로 "목록"이 도움이되지 않을 것이라고 생각합니다.
+1, 아주 좋은 점. 관심있는 사람은 http://en.wikipedia.org/wiki/Memory_barrier 및 링크 된 정보를 확인하십시오. – mghie