0

내 프로젝트의 경우 여러 스레드에서 파일을 읽고 쓰고 있으므로 파일 잠금을 구현해야합니다. 나는 fcntl()을 시도했지만,이 함수는 스레드 간이 아닌 프로세스 간만 작동하는 것으로 보인다. 따라서 다른 해결책을 찾고 있습니다. 필자가 생각해 낸 해결책은 파일에있는 각 레코드에 바이트가있어 레코드가 잠겨 있는지 여부를 나타내는 것입니다. 그런 다음 바쁜 루프를 사용하여 바이트를 읽고 검사 할 수 있습니다.그랜드 센트럴 디스패치를 ​​사용하여 파일 영역 잠금을 효율적으로 구현하는 방법은 무엇입니까?

그래서 두 가지 질문이 있습니다. 첫째, 파일 영역 잠금을 구현하는 가장 효율적인 방법은 무엇입니까? 둘째, 바쁜 루프 접근 방식을 사용하면 그랜드 센트럴 디스패치로 어떻게 최적화 할 수 있습니까? 바쁜 루프가 모두 dispatch_sync()에 전송 된 블록에서 발생할 수 있다고 생각했습니다. 그러나 그것이 효율적으로 작동 할 지조차 모른다.

감사합니다.

답변

1

어때 대략 Dispatch Semaphore? Dispatch Semaphore를 사용하여 독점적으로 리소스에 액세스 할 수 있습니다. 예를 들어 파일 영역에 대한 디스패치 세마포를 만듭니다.

for (int i = 0; i < regions; ++i) 
    sema_[i] = dispatch_semaphore_create(1); 

그런 다음 wait 및 signal을 사용하여 리소스에 액세스하십시오.

dispatch_semaphore_wait(sema_[region], DISPATCH_TIME_FOREVER); 
/* access the region */ 
dispatch_semaphore_signal(sema_[region]); 
+0

그러면 문제는 각 지역마다 메모리를 할당해야한다는 것입니다. 일단 큰 파일이되면, 그것은 많은 메모리입니다 (파일의 각 레코드는 할당 된 메모리를 필요로합니다). 세마포어에 레코드 ID의 맵을 사용할 수 있습니다. 그러나, 그지도를 잠 그거나 병목 현상을 일으킬 수있는 원자 연결 목록을 구현하려면 단일 세마포가 필요합니다. – Maz

+0

mmap으로 큰 파일 문제가 해결 될 수 있습니다. 또는 libsqlite3과 같은 데이터베이스 라이브러리를 원할 수도 있습니다. 대용량 파일에 대해 스레드로부터 안전한 액세스를 제공합니다. –

관련 문제