首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 支持多线程(多进程)的子程序(模块)应该具备哪些特点? [已结贴,结贴人:wooin]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wooin
    • 等级:
    发表于:2008-04-03 23:49:40 楼主
    我要在Linux下用C语言写一个比较独立的模块,供别人调用,类似于一个GUI库、控件库,但是要求要支持多线程(多进程)。
    设计这样的模块应该注意什么问题呢?
    支持多线程(多进程)的模块都有什么特点吗?
    应该如何设计?如何测试?

    谢谢。。。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-04 01:44:441楼 得分:50
    唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
    1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
    2.不直接赋值给全局变量。用访问函数使用同步方式访问全局变量(这是个好的编程习惯)。
    3.注意你调用的其他函数和库函数(这个问题一定要注意,我曾经折腾了好几天)是否是线程安全的或者是可重入的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-04 10:23:322楼 得分: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:263楼 得分:0
    引用 1 楼 darkkeeper 的回复:
    唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
    1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
    2.不直接赋值给全局变量。用访问函数使用同步方式访问全局变量…


    谢谢你分享经验,我还想再了解一下你所说的:
    3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。

    这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wooin
    • 等级:
    发表于:2008-04-04 13:28:184楼 得分:0
    引用 2 楼 sucker2000 的回复:
    引用 1 楼 darkkeeper 的回复:
    唔...,头一次做沙发,忍不住说两句。linux没用过,不过支持多线程的函数就是线程安全(Thread Safe),更准确的说是可重入(reenterable),就是说在多线程中,函数被一个线程调用未返回前又被另一个线程调用而不会造成访问冲突。这要求
    1.函数使用堆栈传递参数和分配局部变量(对于有些编译器来说,会使用寄存器或为局部变量优化存储空间,这种方式是无法重入的)
    2.不直接赋值给全局变量。用访…


    想再跟你详细请教一下关于“可重入”的知识。
    如何设计可重入的子程序?
    推荐一些关于“可重入”比较详细全面的资料吧。。。

    谢谢。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-04 13:35:055楼 得分:0
    引用 3 楼 wooin 的回复:
    谢谢你分享经验,我还想再了解一下你所说的:
    3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。

    这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?


    这个需要自己查询man, 我知道solaris上的man都有关于是否Thread Safe得说明。对于不Thread Safe的函数,一般都会有一个名字一样但多了一个_r后缀的Thread Safe函数可以替代,表示可重入的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wooin
    • 等级:
    发表于:2008-04-04 13:39:186楼 得分:0
    引用 5 楼 sucker2000 的回复:
    引用 3 楼 wooin 的回复:
    谢谢你分享经验,我还想再了解一下你所说的:
    3.注意你调用的其他函数和库函数是否是线程安全的或者是可重入的。

    这一点如何保证,我怎么知道我调用的函数是否是线程安全的?如何验证?

    这个需要自己查询man, 我知道solaris上的man都有关于是否Thread Safe得说明。对于不Thread Safe的函数,一般都会有一个名字一样但多了一个_r后缀的Thread Safe函数可以替代,表示可重入的。

    那么有没有“进程安全”这个概念呢?是不是跟“线程安全”是一样的呢?
    多进程的程序会不会有“可重入”这个问题呢?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-04 14:56:557楼 得分:0
    没有进程安全一说吧,至少我没听过,进程运行于各自的地址空间。要访问其他进程是需要内核服务的。我对linux不懂,没有什么发言权。但基本理论是这样。对于可重入我提到的几点应该是够了。关于Linux下的函数调用看看sucker2000老兄的说明就够了。至于我提到的第一点。如果你不是用内存非常紧张的嵌入系统的情况下。编译器一般都是使用堆栈来分配空间的。要使用一些优化的关键字才会用寄存器和全局空间分配。对于线程间同步,网上或很多书都会讲的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-01 01:34:528楼 得分:0
    没遇到过这种情况.
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved