写了一个简单的 demo 来测试单文件的并发写入,给每个位置写且仅写一次不同的数字,我觉得这个场景貌似是不包含冲突的问题的,因为访问的文件地址都不一样的。但是实际结果确实是产生冲突了。希望有大佬有时间进行指教,谢谢!
代码如下
#include <iostream>
#include <unistd.h>
#include <pthread.h>
#include <stdint.h>
using namespace std;
FILE *fp;
void * running(void * args){
uint8_t* pos = (uint8_t *)args;
FILE * nowfp = fp;
fseek(nowfp,*pos,SEEK_SET);
fwrite(pos,1,1,nowfp);
delete pos;
return 0;
}
int main(int,char **){
fp = fopen("test.bin","wb+");
pthread_t t_a;
for(int i =0;i<100;i++){
uint8_t* j = new uint8_t(i);
pthread_create(&t_a,NULL,running,j);
}
while (true)
{
sleep(1000);
}
return 0;
}
程序输出结果如下 除了第一个位置以外,有很多值为 0 的点。不太明白这个并发冲突产生在哪里。:
Offset: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000: 00 00 02 03 01 00 00 07 08 04 0A 0B 0C 0D 0E 0F ................
00000010: 10 11 12 13 2F 15 16 17 18 19 1A 1B 00 1D 1E 1F ..../...........
00000020: 20 21 22 23 00 25 26 40 28 00 2A 2B 2C 2D 2E 00 .!"#.%&@(.*+,-..
00000030: 30 31 32 33 34 35 36 37 00 39 3A 3B 00 3D 3E 3F 01234567.9:;.=>?
00000040: 00 41 42 43 44 45 46 47 3C 48 00 4B 4C 4D 4E 4F .ABCDEFG<H.KLMNO
00000050: 50 51 52 53 54 55 56 57 58 59 00 5B 5C 5D 5E 5F PQRSTUVWXY.[\]^_
00000060: 60 61 62 63 `abc
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.