免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pksun
打印 上一主题 下一主题

多个线程同时写一个文件的问题!!!!! [复制链接]

论坛徽章:
0
31 [报告]
发表于 2004-08-30 16:16 |只看该作者

多个线程同时写一个文件的问题!!!!!

原帖由 "odin_free" 发表:



我看这个观点不对 如果不flock或者fcntl 会出问题


flock函数怎么使用啊?我现在手头没有unix,VC下好像又没有这个函数

论坛徽章:
0
32 [报告]
发表于 2004-08-30 20:16 |只看该作者

多个线程同时写一个文件的问题!!!!!

原帖由 "pksun" 发表:


fseek(...., SEEK_END)
fwrite(..........)
这样会出问题吗?因为写入是在一条语句里面,写入的内容应该不会乱

如果用锁,那不就跟单线程运行没区别了。但这程序就是大量的数据接收、写入


对于你写来说是同一条语句,但对于操作系统来说,他们不是原子操作。
如果你不能确定这两个函数是线程安全的,最好还是要有锁机制。
逻辑最清晰的就用文件锁。
不过我还是倾向于用信号量。
这样做不会说和单线程没有区别,首先对于临界资源来说只能一个一个来,所以一定要有互斥机制。
其次,你的工作线程也不会只完成写文件这一个动作吧,在一个线程进行写动作的时候其他线程完全可以做其他的事情,所以加了互斥机制并不会和单线程等同起来。

论坛徽章:
0
33 [报告]
发表于 2004-08-30 20:19 |只看该作者

多个线程同时写一个文件的问题!!!!!

原帖由 "pksun" 发表:


flock函数怎么使用啊?我现在手头没有unix,VC下好像又没有这个函数


这种问题真不该在这里问。
答案就是
man flock
or
google flock

论坛徽章:
0
34 [报告]
发表于 2004-08-30 21:08 |只看该作者

多个线程同时写一个文件的问题!!!!!

原帖由 "unicorns" 发表:


这种问题真不该在这里问。
答案就是
man flock
or
google flock


没有unix,man不了
google上没有找到有用的东西
因为是需要把代码添加进去然后直接拿到客户那儿编译运行,所以希望有正确的代码.麻烦各位了

论坛徽章:
0
35 [报告]
发表于 2004-08-31 10:33 |只看该作者

多个线程同时写一个文件的问题!!!!!

锁住文件。
语法: boolean flock(int fp, int operation);
返回值: 布尔值
函数种类: 文件存取
内容说明: 本函数用来锁住文件,使别的行程无法存取。传入的参数 fp 为文件的指针。参数 operation 的值为下列的数字之一:1 表示配置锁住文件可以允许别的行程读取;2 表示只有该行程可以写入文件;3 表示读写均锁住;4 则不锁住区块 (block)。而本函数无论在 UNIX 或是 Windows 系列中的锁住效果都相近。执行成功则返回 true 值,否则返回 false 值

论坛徽章:
0
36 [报告]
发表于 2004-09-01 09:45 |只看该作者

多个线程同时写一个文件的问题!!!!!

不管是fcntl还是flock,都是用文件锁。
用文件锁还是信号量,我觉得还是信号量好一些,执行效率要高一些吧!


pksun  :写到:
我目的是允许多个线程同时操作一个文件,但需要防范出现系统错


如果要防范出错,在同一时刻只能有一个线程对文件操作呀

论坛徽章:
0
37 [报告]
发表于 2004-09-01 10:53 |只看该作者

多个线程同时写一个文件的问题!!!!!

打开的时候用append模式,应该就没问题了。

论坛徽章:
0
38 [报告]
发表于 2004-09-01 14:37 |只看该作者

多个线程同时写一个文件的问题!!!!!

刚看到这段代码,不知道是否安全:/*初学者*/

int main (int argc, char* argv[])
{
char* file = argv[1];
int fd;
struct flock lock;
printf (“opening %s\n”, file);
/* Open a file descriptor to the file. */
fd = open (file, O_WRONLY);
printf (“locking\n”);
/* Initialize the flock structure. */
memset (&lock, 0, sizeof(lock));
lock.l_type = F_WRLCK;
/* Place a write lock on the file. */
fcntl (fd, F_SETLKW, &lock);
printf (“locked; hit Enter to unlock... “);
/* Wait for the user to hit Enter. */
getchar ();
printf (“unlocking\n”);
/* Release the lock. */
lock.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &lock);
close (fd);
return 0;
}

论坛徽章:
0
39 [报告]
发表于 2004-09-01 15:56 |只看该作者

多个线程同时写一个文件的问题!!!!!

你想要什么的结果呢

论坛徽章:
0
40 [报告]
发表于 2004-09-03 17:28 |只看该作者

多个线程同时写一个文件的问题!!!!!

原帖由 "boylitao" 发表:
锁住文件。
语法: boolean flock(int fp, int operation);
返回值: 布尔值
函数种类: 文件存取
内容说明: 本函数用来锁住文件,使别的行程无法存取。传入的参数 fp 为文件的指针。参数 operation 的值为下列的数..........


谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP