マルチスレッドのプログラミング

共有入出力と新しい入出力システムコール

複数のスレッドが同じファイル記述子を使って同時に入出力操作を行う場合、従来の UNIX の入出力インタフェースがスレッドに対して安全ではない場合があります。この問題が生じるのは、入出力が逐次的に行われない場合です。システムコール lseek(2) でファイルオフセットを設定し、そのオフセットで次の read(2) または write(2) を呼び出してファイル内の操作開始位置を指定する場合です。このとき、同じファイル記述子に対して複数のスレッドが lseeks() を実行してしまうと矛盾が生じます。

この矛盾は、新しいシステムコール pread(2)pwrite(2) で回避できます。


#include <sys/types.h>
#include <unistd.h>

ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);

ssize_t pwrite(int filedes, void *buf, size_t nbyte,
    off_t offset);

これらのシステムコールの動作は、ファイルオフセットを指定するための引数が追加されていることを除いて、read(2)write(2) とそれぞれ同じです。lseek(2) の代わりに、この引数でオフセットを指定すれば、複数のスレッドから同じファイル記述子に対して安全に入出力操作を実行できます。