5 十一月, 2006
thread safety,就必须保证所有的函数线程安全
用到libxml2的nanohttp模块,虽说libxml2自从2.4.7版本开始就号称已经做到thread safety了,但是,至少这个附加的nanohttp模块在多线程环境中是不安全的。
即便你用--with-threads和--with-thread-alloc选项编译libxml2,也只能保证libxml2库在Parser和内存分配这部分线程安全。nanohttp的不安全不是因为libxml2自己内存管理冲突。
事实上,当多个线程同时调用nanohttp模块的时候,主机地址解析就会发生冲突。用tcpdump查看多线程调用nanohttp fetch的网络包,就发现,经常地,应当向B主机发送的请求却被发送到A主机。
原因是这个模块中调用了非线程安全的函数gethostbyname。处理B主机请求的线程调用gethostbyname(B),它生成的hostent数据覆盖了这之前负责处理A请求的线程的gethostbyname(A)的数据。结果,B主机请求就被发送到了A,张冠李戴了。
要想实现thread safety,就必须使用gethostbyname的线程安全版gethostbyname_r。
同理,象localtime、gmtime之类的函数,与gethostbyuname类似,返回结果的内存分配不是由调用者控制的,都不是thread-safe的。应该用他们各自的reenter版,分别是localtime_r,gmtime_r。
这里找到一份Thread-Safe and Thread-Unsafe Procedure List
最新回复
发表评论



