正看着 d 语言的 tango 库向易用错的方向走

2 views
Skip to first unread message

redsea

unread,
Sep 28, 2008, 6:22:06 AM9/28/08
to TopLanguage
他们为了性能, 将 cerr, cout 都设计成线程不安全 (据称有三倍性能差距), 另外提供了一些输出和格式化的对象, Stdout,
Format, 也都是线程不安全的对象.

我给他们提过意见, 没有被接受.

当今世界上, 除了少数 filter 程序 (unix 下面的 wc, sort, uniq 之类的), 哪里还有什么其他程序是会使用输入输
出比较多, 而且不用多线程的 ? 为此目的, 应该将缺省的东西设计成线程安全的, 快速版本另外提供, 才是一个易于安全使用的库.

眼下我们的项目中, 禁止使用所有这些对象, 使用自己实现的线程安全版本. 用 grep 查找危险, 找到了就要批评.

shiwei xu

unread,
Sep 28, 2008, 6:28:21 AM9/28/08
to pon...@googlegroups.com
我个人比较认可 tango 库的做法。如果让我来设计,我也会设计成非线程安全的(这个原则和语言无关)。我觉得基础库中那些所谓的线程安全组件,都是历史遗留,没有必要保留这个特性。
 
欢迎讨论。

2008/9/28 redsea <red...@gmail.com>

redsea

unread,
Sep 28, 2008, 6:37:50 AM9/28/08
to TopLanguage
一个容易用错的库, 我认为不是一个好的设计.

并发错误会导致难以调试的错误.

格式化 IO 输出, 对于大多数程序来说, 不是瓶颈所在, 虽说有三倍性能差距, 但是除非 benchmark 比拼和 filter 程序,
对其他程序来说, 三倍性能差距的影响其实很小.

redsea

unread,
Sep 28, 2008, 6:40:07 AM9/28/08
to TopLanguage
想起来, gethostbyname 这个线程不安全的函数, 也导致过不少程序出现难以重复出现的错误.

shiwei xu

unread,
Sep 28, 2008, 6:47:18 AM9/28/08
to pon...@googlegroups.com
嗯,我指的是那些用锁来达到线程安全的组件。
 
gethostbyname 这种使用了全局变量的函数,无二话,应该拖出去毙了。
2008/9/28 redsea <red...@gmail.com>
想起来, gethostbyname 这个线程不安全的函数, 也导致过不少程序出现难以重复出现的错误.


Oldrev

unread,
Sep 28, 2008, 11:47:42 AM9/28/08
to TopLanguage
静态函数之类的设计成非线程安全也是无可厚非的,.Net 里也是这个原则。

张鹏程

unread,
Oct 3, 2008, 10:54:31 PM10/3/08
to pon...@googlegroups.com
我觉得IO的同步问题,是可以用眼睛看出来的啊。因此在程序的实现中,用不同的同步方法达到更好的的效率和易用的平衡。
虽然线程完全已经如此的重要,但也不是说程序员要置身世外,把问题都留给编译器和库吧。

2008/9/28 Oldrev <old...@gmail.com>

redsea

unread,
Oct 3, 2008, 11:53:25 PM10/3/08
to TopLanguage
是可以用眼睛看出来:
多线程程序, 如果多个线程同时做 IO, 只要有一个 IO 没有做同步, 那么就是有问题, 但是这样写程序, 不是很累吗 ?

陈啸豪

unread,
Oct 4, 2008, 4:34:43 AM10/4/08
to pon...@googlegroups.com
各位都是用d语言从事什么开发?

2008/10/4 redsea <red...@gmail.com>



--
Best regards,

redsea

unread,
Oct 4, 2008, 5:50:28 AM10/4/08
to TopLanguage
数据通信, 统计分析.

On 10月4日, 下午4时34分, "陈啸豪" <xiaohao.c...@gmail.com> wrote:
> 各位都是用d语言从事什么开发?
>
> 2008/10/4 redsea <red...@gmail.com>

taodm

unread,
Oct 5, 2008, 9:48:58 PM10/5/08
to TopLanguage
多个线程用同一个io口并发io?这个能算好设计么?

redsea

unread,
Oct 5, 2008, 11:38:52 PM10/5/08
to TopLanguage
我是在用来做 log 的过程中碰到并发问题的.

--- 用 console io 来做 log 能算好设计吗 ?

好不好不管了:

1. 简单, 要格式化的时候, 比 log format 容易.
日常要用的东西, 复杂程度高一点, 出问题/或者不充分利用 的机会就会多一点.

2. 世界上的问题总是很复杂的, 一些未必最好的用场, 会有用武之地.
例如 vmware 里面跑 linux, 分配双cpu 用 tsc timer, linux 可能会由于内部双 cpu tsc 差异处
理代码和 vmware 的双cpu 分配策略冲突导致死机; 分配 jiffies timer, 内部时间可能不准, ntp 都无法校准; 分
配 vmi_timer, 似乎是使用 timer 相关的东西越多, vmware 的 vmi 越容易出问题, 此时不用 log 还可以减少出问
题的几率.

---------

另外一个问题:

如果某个线程检查到严重错误, 决定用 stderr/cerr 显示一些错误信息然后 abort 程序, 这个需求总是有用的吧 ? c/c
++ 里面的 stderr/cerr 都是线程安全的, 随时可以输出信息, 目前 tango 的不是这样.

On Oct 6, 9:48 am, taodm <tao.dongm...@zte.com.cn> wrote:
> 多个线程用同一个io口并发io?这个能算好设计么?
>

Kyle M. Lee

unread,
Oct 6, 2008, 12:24:16 AM10/6/08
to pon...@googlegroups.com
可以考虑实现一个线程安全的日志模块吧。比如一个可以复活的单件的日志模块。

2008/10/6 redsea <red...@gmail.com>

良少

unread,
Oct 9, 2008, 1:46:11 AM10/9/08
to TopLanguage
请问怎样设计成线程安全的? 线程是操作系统提供的,D语言里有这样的设施吗?
而且,你可以在使用时使用线程代码 把 cerr, cout 锁住,然后使用。
我虽然不懂D语言,但是并不觉得这样设计有什么不妥之处。

而且,C,C++,Java语言等也都是 设计成 线程不安全的。 我不清楚 cerr, cout 在Java中是不是线程不安全
的。
> > 眼下我们的项目中, 禁止使用所有这些对象, 使用自己实现的线程安全版本. 用 grep 查找危险, 找到了就要批评.- 隐藏被引用文字 -
>
> - 显示引用的文字 -

redsea

unread,
Oct 9, 2008, 2:03:29 AM10/9/08
to TopLanguage
c 的 printf 是线程安全的, c++ 的 cerr, cout 是线程安全的, 这个坛子之前已经分析过了.
Reply all
Reply to author
Forward
0 new messages