并发编程——是否需要手动锁定多个进程将访问的文件?
Concurrent programming - Is it necessary to manually lock files that multiple processes will be accessing?
我知道对于 pthreads,如果它们正在修改相同的变量或文件,您可以使用 pthread_mutex_lock
来防止同时写入。
如果我使用 fork()
让多个进程编辑同一个文件,我如何确保它们不会同时写入该文件?
理想情况下,我想一次为一个作者锁定文件,并且每个进程只需要写入一次(不需要循环)。我需要手动执行此操作还是 UNIX 会为我执行此操作?
简短回答:您必须手动完成。每次写入的原子性都有一定的保证,但您仍然需要同步进程以避免写入交错。有很多同步进程的技术。由于您的所有编写器都是公共进程的后代,因此最简单的事情可能是在公共管道上传递令牌。在 fork 之前,创建一个管道并向其中写入一个字节。任何时候一个进程想要写入文件,它都会在管道上进行阻塞读取。如果它得到一个字节,那么它会继续写入文件。完成后,它将一个字节写回管道。如果任何其他进程想要访问该文件,它将阻塞读取管道,直到其他进程完成写入。这通常比使用信号量更简单,信号量是另一种出色的技术。
我知道对于 pthreads,如果它们正在修改相同的变量或文件,您可以使用 pthread_mutex_lock
来防止同时写入。
如果我使用 fork()
让多个进程编辑同一个文件,我如何确保它们不会同时写入该文件?
理想情况下,我想一次为一个作者锁定文件,并且每个进程只需要写入一次(不需要循环)。我需要手动执行此操作还是 UNIX 会为我执行此操作?
简短回答:您必须手动完成。每次写入的原子性都有一定的保证,但您仍然需要同步进程以避免写入交错。有很多同步进程的技术。由于您的所有编写器都是公共进程的后代,因此最简单的事情可能是在公共管道上传递令牌。在 fork 之前,创建一个管道并向其中写入一个字节。任何时候一个进程想要写入文件,它都会在管道上进行阻塞读取。如果它得到一个字节,那么它会继续写入文件。完成后,它将一个字节写回管道。如果任何其他进程想要访问该文件,它将阻塞读取管道,直到其他进程完成写入。这通常比使用信号量更简单,信号量是另一种出色的技术。