내 프로젝트의 경우 여러 스레드에서 파일을 읽고 쓰고 있으므로 파일 잠금을 구현해야합니다. 나는 fcntl()
을 시도했지만,이 함수는 스레드 간이 아닌 프로세스 간만 작동하는 것으로 보인다. 따라서 다른 해결책을 찾고 있습니다. 필자가 생각해 낸 해결책은 파일에있는 각 레코드에 바이트가있어 레코드가 잠겨 있는지 여부를 나타내는 것입니다. 그런 다음 바쁜 루프를 사용하여 바이트를 읽고 검사 할 수 있습니다.그랜드 센트럴 디스패치를 사용하여 파일 영역 잠금을 효율적으로 구현하는 방법은 무엇입니까?
그래서 두 가지 질문이 있습니다. 첫째, 파일 영역 잠금을 구현하는 가장 효율적인 방법은 무엇입니까? 둘째, 바쁜 루프 접근 방식을 사용하면 그랜드 센트럴 디스패치로 어떻게 최적화 할 수 있습니까? 바쁜 루프가 모두 dispatch_sync()
에 전송 된 블록에서 발생할 수 있다고 생각했습니다. 그러나 그것이 효율적으로 작동 할 지조차 모른다.
감사합니다.
그러면 문제는 각 지역마다 메모리를 할당해야한다는 것입니다. 일단 큰 파일이되면, 그것은 많은 메모리입니다 (파일의 각 레코드는 할당 된 메모리를 필요로합니다). 세마포어에 레코드 ID의 맵을 사용할 수 있습니다. 그러나, 그지도를 잠 그거나 병목 현상을 일으킬 수있는 원자 연결 목록을 구현하려면 단일 세마포가 필요합니다. – Maz
mmap으로 큰 파일 문제가 해결 될 수 있습니다. 또는 libsqlite3과 같은 데이터베이스 라이브러리를 원할 수도 있습니다. 대용량 파일에 대해 스레드로부터 안전한 액세스를 제공합니다. –