Parallel processing 如何使用grand central dispatch有效地实现文件区域锁定?

Parallel processing 如何使用grand central dispatch有效地实现文件区域锁定?,parallel-processing,grand-central-dispatch,file-locking,Parallel Processing,Grand Central Dispatch,File Locking,对于我的项目,我从多个线程读取和写入文件,所以我需要实现文件锁定。我已经尝试了fcntl(),但该函数似乎只适用于进程之间的锁定,而不适用于线程之间的锁定。因此,我正在寻找另一种解决办法。我提出的解决方案(可能不是最好的)是在我的文件中的每条记录中都有一个字节来指示记录是否被锁定,然后我可以使用一个忙循环来读取和检查字节 所以,我有两个问题。首先,实现文件区域锁定的最有效方法是什么?第二,如果我使用忙循环方法,如何使用大中央调度优化该方法?我在想,我可以让所有的忙循环在发送到dispatch\u

对于我的项目,我从多个线程读取和写入文件,所以我需要实现文件锁定。我已经尝试了
fcntl()
,但该函数似乎只适用于进程之间的锁定,而不适用于线程之间的锁定。因此,我正在寻找另一种解决办法。我提出的解决方案(可能不是最好的)是在我的文件中的每条记录中都有一个字节来指示记录是否被锁定,然后我可以使用一个忙循环来读取和检查字节

所以,我有两个问题。首先,实现文件区域锁定的最有效方法是什么?第二,如果我使用忙循环方法,如何使用大中央调度优化该方法?我在想,我可以让所有的忙循环在发送到
dispatch\u sync()
的块中发生。但我不知道这是否有效

谢谢。

怎么样?您可以使用分派信号量以独占方式访问资源。例如,为您的文件区域创建分派信号量

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

问题是我必须为每个区域分配内存。一旦它变成一个大文件,就需要大量内存(因为文件中的每个记录都需要分配内存)。我可以使用记录ID到信号量的映射。但是,我需要一个信号量来锁定该映射,或者实现一个原子链表,这将导致瓶颈。mmap可能解决大文件问题。或者您可能需要像libsqlite3这样的数据库库。它为大文件提供线程安全访问。
dispatch_semaphore_wait(sema_[region], DISPATCH_TIME_FOREVER);
/* access the region */
dispatch_semaphore_signal(sema_[region]);