ファイルの読み書き競合問題の探求について
2613 ワード
私がログを書くとき、プロジェクトはもちろんマルチスレッド、マルチプロセスです.時々出るcエラー(windowsの下)、プロジェクトではログ以外にファイルの読み書きが行われていないので、最初の考えはログの書き込みが衝突したのではないでしょうか.このようなエラーは少ないが、私の注意を引いたので、マルチプロセス、マルチスレッドがファイルを書く操作で書く衝突が発生するかどうかという問題があります.
そのためubuntuで実験をしました.コードは以下の通りです.
コードの機能:4つのプロセスが同時に開いているファイルを書き込みます.パラレルレベルを高くするために、書き込みセグメントごとに10ミリ秒寝ます.
実行結果:
15 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 16 pid01:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 17 pid02:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 18 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 19 pid04:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz ...........................................
上は15~19行の結果の一部をコピーしただけです
結果:上記の結果から:1.4つのプロセスは、挿入実行2である.各書き込み操作は独立して行われ,半分書き込み後に他のプロセスに中断される現象は存在しない.
この実験の結果は書き込み衝突も書き込み中断も生じなかったが、これはその一例にすぎず、さらなる理論的推証が必要である......
そのためubuntuで実験をしました.コードは以下の通りです.
#include
#include
#include
#include
#include
int main(int argc,char *argv[]){
printf("hello
");
int i=0 ;
int file = open("myte",O_RDWR | O_CREAT);
char buf[50] ="0123456789abcdefghijklmnopqrstuvwxyz\r
" ;
if(file<0){
perror("open file error");
exit(-1);
}
int fd = fork();
if(fd<0){
perror("fork error");
exit(-1);
}
if(fd>0){
int fd01 = fork();
for(i =1000;i>0;i--)
if(fd01)
{ write(file,"pid01:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r
",116); usleep(1);}
else
{ write(file,"pid02:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r
",116); usleep(1);}
}else{
int fd02 = fork();
for(i =1000;i>0;i--)
if(fd02)
{ write(file,"pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r
",116); usleep(1);}
else
{ write(file,"pid04:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz\r
",116); usleep(1);}
}
printf("after fork
");
sleep(1);
close(file);
return 0;
}
コードの機能:4つのプロセスが同時に開いているファイルを書き込みます.パラレルレベルを高くするために、書き込みセグメントごとに10ミリ秒寝ます.
実行結果:
15 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 16 pid01:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 17 pid02:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 18 pid03:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz 19 pid04:0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz ...........................................
上は15~19行の結果の一部をコピーしただけです
結果:上記の結果から:1.4つのプロセスは、挿入実行2である.各書き込み操作は独立して行われ,半分書き込み後に他のプロセスに中断される現象は存在しない.
この実験の結果は書き込み衝突も書き込み中断も生じなかったが、これはその一例にすぎず、さらなる理論的推証が必要である......