免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4388 | 回复: 8
打印 上一主题 下一主题

[C] 关于返回句柄问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-12 18:14 |只看该作者 |倒序浏览
一个函数返回一个句柄(可能是个索引,也可能是个指针)

其他函数针对这个句柄进行相关操作

问题1,如果这个句柄是个指针,其他函数怎样判断传进来的句柄是否可用?

问题2,如果是个索引,为了使函数线程安全,所有对句柄的操作都需要加锁?对吗

论坛徽章:
0
2 [报告]
发表于 2012-09-13 09:22 |只看该作者
顶一下

一直不知道怎样做比较好

发现 FILE *fp = fopen(); 和 fread(fp); 这两个函数跟我说的类似

系统为了简单起见句柄用的是指针形式,当操作句柄时(fread),如果传来的参数是错的,直接段错误

也就是我的问题1,根本不做参数判断

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2012-09-13 09:29 |只看该作者
条件不足,没有确定的答案

论坛徽章:
0
4 [报告]
发表于 2012-09-13 09:34 |只看该作者
回复 3# hellioncu
实在不太清楚该怎样问了,就是大家在实现一般的句柄操作函数时,怎样保证线程安全的?


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
5 [报告]
发表于 2012-09-13 10:01 |只看该作者
ch_chosen 发表于 2012-09-13 09:34
回复 3# hellioncu
实在不太清楚该怎样问了,就是大家在实现一般的句柄操作函数时,怎样保证线程安全的? ...


这里的句柄和句柄对应的东西都是你自己定义的,旁人怎么能告诉你是否线程安全?

论坛徽章:
0
6 [报告]
发表于 2012-09-13 10:11 |只看该作者
回复 5# hellioncu
就是我想问个大家通常的作法

这样说吧,我要实现一个FILE *fp = fopen()和fread(FILE *fp)两个函数,怎样才能做到fread(fp = NULL)这样传参数不发生段错误,而且保证实现的fread函数是线程安全的


   

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2012-09-13 10:13 |只看该作者
ch_chosen 发表于 2012-09-13 10:11
回复 5# hellioncu
就是我想问个大家通常的作法


一般来说,指针是否有效是无法判断的(NULL是一个特殊例子)

论坛徽章:
0
8 [报告]
发表于 2012-09-13 11:42 |只看该作者
指针(即楼主所说的句柄)有值但无效,这只是导致函数调用失败的一种情况。
fread(FILE *fp)中,可以先确定fp是否为NULL。
如果不为NULL,就姑且当做有效的指针来处理。如果函数中某些操作(比如系统调用)返回错误,那么fread也返回错误,甚至可以终止程序。
例如strcpy,传NULL进去,它就是很简单的崩掉,来提示用户,你传参有问题。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
9 [报告]
发表于 2012-09-13 20:41 |只看该作者
句柄是句柄,指针是指针,指针是编译器的东西,句柄是OS的东西,两都没有任何关系。。。

回答你的问题:
1.你说的FILE,那是个指针。。。。当然不可能同时是句柄。。。。
2.线程安全,任何对象及系统调用,都不可能是
  1. 逻辑
复制代码
上线程安全的。。。
线程安全是相对的,不安全是绝对的。线程安全从来都要程序员自已保证。
(OS只能也仅能保证一个/一次系统调用是原子的,也就是线程、进程安全的。。。)
FILE则还一次调用也无法保证是原子的。

说了这么多,把自已都绕晕了。阿门。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP