首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
Linux/Unix社区
程序开发区
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
支持多线程(多进程)的子程序(模块)应该具备哪些特点?
[已结贴,结贴人:wooin]
加为好友
发送私信
在线聊天
wooin
魑魅魍魉
等级:
发表于:
2008-04-03 23:49:40
楼主
我要在Linux下用C语言写一个比较独立的模块,供别人调用,类似于一个GUI库、控件库,但是要求要支持多线程(多进程)。
设计这样的模块应该注意什么问题呢?
支持多线程(多进程)的模块都有什么特点吗?
应该如何设计?如何测试?
谢谢。。。
问题点数:
100
回复次数:
8
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
darkkeeper
Darkkeeper
等级:
发表于:
2008-04-04 01:44:44
1
楼 得分:
50
唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
2.不直接赋值给全局变量。用访问函数使用同步方式访问全局变量(这是个好的编程习惯)。
3.注意你调用的其他函数和库函数(这个问题一定要注意,我曾经折腾了好几天)是否是线程安全的或者是可重入的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
sucker2000
老杨同志
等级:
发表于:
2008-04-04 10:23:32
2
楼 得分:
50
引用 1 楼 darkkeeper 的回复:
唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
2.不直接赋值给全局变量。用访问函数使用同步方式访问全局变…
楼上总结的不错.我就线程安全(Thread Safe)和可重入(reenterable)在多说几句.
看了好几本参考说,提到这两个概念,但都没说清楚二者的关系.我的理解是可重入(reenterable)是比线程安全(Thread Safe)更高层次的概念:
1. 可重入(reenterable)一定是比线程安全(Thread Safe);反之则不然
2. 可重入(reenterable)强调了模块或函数的可并发能力,可以由多个thread同时调用执行
3. 线程安全(Thread Safe)的模块或函数不一定就能可重入, 因为有可能内部用了mutex或者其它同步方式,从而限制了多个thread对此模块或函数的并发执行.
4. 尽量以可重入(reenterable)为实现目标来充分利用如今日益流行的多核硬件技术来提高执行效率.
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wooin
魑魅魍魉
等级:
发表于:
2008-04-04 13:21:26
3
楼 得分:
0
引用 1 楼 darkkeeper 的回复:
唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
2.不直接赋值给全局变量。用访问函数使用同步方式访问全局变量…
谢谢你分享经验,我还想再了解一下你所说的:
3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。
这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wooin
魑魅魍魉
等级:
发表于:
2008-04-04 13:28:18
4
楼 得分:
0
引用 2 楼 sucker2000 的回复:
引用 1 楼 darkkeeper 的回复:
唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
2.不直接赋值给全局变量。用访…
想再跟你详细请教一下关于“可重入”的知识。
如何设计可重入的子程序?
推荐一些关于“可重入”比较详细全面的资料吧。。。
谢谢。。。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
sucker2000
老杨同志
等级:
发表于:
2008-04-04 13:35:05
5
楼 得分:
0
引用 3 楼 wooin 的回复:
谢谢你分享经验,我还想再了解一下你所说的:
3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。
这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?
这个需要自己查询man, 我知道solaris上的man都有关于是否Thread Safe得说明。对于不Thread Safe的函数,一般都会有一个名字一样但多了一个_r后缀的Thread Safe函数可以替代,表示可重入的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
wooin
魑魅魍魉
等级:
发表于:
2008-04-04 13:39:18
6
楼 得分:
0
引用 5 楼 sucker2000 的回复:
引用 3 楼 wooin 的回复:
谢谢你分享经验,我还想再了解一下你所说的:
3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。
这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?
这个需要自己查询man, 我知道solaris上的man都有关于是否Thread Safe得说明。对于不Thread Safe的函数,一般都会有一个名字一样但多了一个_r后缀的Thread Safe函数可以替代,表示可重入的。
那么有没有“进程安全”这个概念呢?是不是跟“线程安全”是一样的呢?
多进程的程序会不会有“可重入”这个问题呢?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
darkkeeper
Darkkeeper
等级:
发表于:
2008-04-04 14:56:55
7
楼 得分:
0
没有进程安全一说吧,至少我没听过,进程运行于各自的地址空间。要访问其他进程是需要内核服务的。我对linux不懂,没有什么发言权。但基本理论是这样。对于可重入我提到的几点应该是够了。关于Linux下的函数调用看看sucker2000老兄的说明就够了。至于我提到的第一点。如果你不是用内存非常紧张的嵌入系统的情况下。编译器一般都是使用堆栈来分配空间的。要使用一些优化的关键字才会用寄存器和全局空间分配。对于线程间同步,网上或很多书都会讲的。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
knowledge_Is_Life
阿凡
等级:
发表于:
2008-05-01 01:34:52
8
楼 得分:
0
没遇到过这种情况.
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友