큰 배열이 있고 여러 스레드로 내용을 처리하려고한다고 가정 해보십시오. 중복을 보장하지 않고 특정 섹션에 각 스레드를 위임하면 스레드가 배열 외부의 다른 메모리에 액세스하지 않는다고 가정 할 때 잠금이 필요하지 않습니다. 이 (의사 코드) 같은여러 스레드가 동일한 메모리에 액세스하지 못하도록함으로써 잠금을 피할 수 있습니까?
뭔가 : 실제로
global array[9000000];
do_something(chunk) {
for (i = chunk.start; i < chunk.end; i++)
//do something with array
}
main() {
chunk1 = {start: 0, end: 5000000};
chunk2 = {start: 5000000, end: 9000000};
start_thread(thread1, do_something(chunk1));
start_thread(thread2, do_something(chunk2));
wait_for_join(thread1);
wait_for_join(thread2);
//do something else with the altered array
}
C++ 03에서이 동작을 제공하지 않는 컴파일러가 있습니까? 비록 그것이 공식화되지는 않았지만, 그것은 현대적인 하드웨어에서 꽤 일반적인 특징이었습니다 ... – Errata
이것은 하드웨어와 아무 관련이 없습니다. src에서 dst로 15 바이트를 복사하려고한다고 가정 해 봅시다. 컴파일러는 dst에서 변경되지 않고 유지되어야하는 바이트를 읽고, 벡터 레지스터를 사용하여 16 바이트를 복사하고, 1 바이트를 다시 씁니다. 모든 스레드가 그 바이트를 보았습니다. 귀하의 소스 코드는 동일한 코드에 액세스하지 않았지만 컴파일 된 코드는 액세스했습니다. C11 및 C++ 11에서는이 작업을 수행하지 않습니다. 다른 비트 필드는 동일한 메모리로 간주 될 수 있습니다. – gnasher729