Chinaunix首页 | 论坛 | 博客
  • 博客访问: 196457
  • 博文数量: 96
  • 博客积分: 1781
  • 博客等级: 上尉
  • 技术积分: 970
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-07 12:31
文章分类

全部博文(96)

文章存档

2014年(1)

2013年(14)

2012年(44)

2011年(37)

分类: LINUX

2011-05-27 10:16:48

  项目中涉及数据的读取和发送,由于对线程不熟悉,我将读取和发送分成了两个独立的程序,先实现功能再更新为多线程版本。但两个程序共用一个文件时同样会出现同步问题。所以必须加锁。

   这次选择的是lockf。在实验时a.b程序交替往同一文件写东西需要注意的

(错误 版本)--》由于每次解锁都是对后面的部分解锁,所以b程序仍然无法获得可写的锁,所以结果是a程序一直写,等结束了,b才可以写。

for(i=0;i<3;i++)
9 {
 10 print_time("a start lock");
12 lockf(fd,F_LOCK,0);
13 print_time("a get lock");
 14 buff_a[2]=i+'0';
16 write(fd,buff_a,4);
 17 sleep(5);
19 lockf(fd,F_ULOCK,0);
 20 print_time("a reless lock");
22 sleep(1);
23 }

(正确版本1)--》为解决解锁问题,我们在每次写完后立即调用fclose来达到关闭锁的目的。

for(i=0;i<3;i++)
{
Open(&fd);
print_time("a start lock");
lockf(fd,F_LOCK,0);
print_time("a get lock");
buff_a[2]=i+'0';
write(fd,buff_a,4);
sleep(5);
 // lockf(fd,F_ULOCK,0); ---》此指令是释放目前到后面的锁。如果没有后面的close,b仍然无法获取锁。
print_time("a reless lock");
  close(fd);--》关闭文件IO,可以释放前面所加的锁。
sleep(2);
}
return 0;
(正确版本2)--》如果不关闭IO,可以通过lseek指针的移动来达到完整加锁和完整解锁的目的,这样a,b程序可以正确的依次往共用文件里写东西。
Open(&fd);
8 for(i=0;i<3;i++)
9 {
10 print_time("a start lock");
11 lseek(fd,SEEK_SET,0);
12 lockf(fd,F_LOCK,0);
13 print_time("a get lock");
14 buff_a[2]=i+'0';
 15 lseek(fd,SEEK_END,0);--》因为是添加到文件末尾,所以要移动指针。
16 write(fd,buff_a,4);
17 sleep(5);
 18 lseek(fd,SEEK_SET,0);--》必须对全部文件解锁,这样b才可以得到写的权限。
19 lockf(fd,F_ULOCK,0);
20 print_time("a reless lock");
21 //close(fd);
22 sleep(1);
23 }

阅读(1995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~