linux系统中读写锁的问题

问题描述:

我们的应用程序采用了共享内存和读写锁的机制来实现多进程的并发访问,但测试时发现读写锁有问题,我们所采用的锁是pthread_rwlock_rdlock、pthread_rwlock_wrlock这组函数。

 

现象:

    pthread_rwlockattr_setpshared(&attr,PTHREAD_PROCESS_SHARED);调用出错,返回代码38,经查是系统不支持的原因。

 

 

系统环境:

uname -a
Linux s12084 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386 GNU/Linux

 

g++ 3.2.3

 

 

问题解决:

因为之前在这种环境运行过,所以怀疑可能是补丁或者系统的版本问题,后来发现 .bash_profile中有下面这行:
export LD_ASSUME_KERNEL=2.4.19 #for build oracle db

原来这是装oracle 时添加的,当时安装oracle有问题才加上的。

 

这种情况下查看关于读写锁的测试程序,此时执行:ldd locktest ,显示
        /lib/libcwait.so (0x00eb0000)
        libpthread.so.0 => /lib/i686/libpthread.so.0 (0x003d3000)     ----和下面所采用的libpthread不是用的同一个目录下的库。


执行 unset LD_ASSUME_KERNEL 后
此时执行:ldd locktest
        /lib/libcwait.so (0x00f19000)
        libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00b8e000)      ---tls目录所采用的libpthread是能保证读写锁正确性的,上面的不支持读写锁。

 

通过去掉 LD_ASSUME_KERNEL ,则系统连接到了tls目录下的libpthread.so.0,此时读取锁功能正常了。

 

关于linux下的线程库的资料可以参考:

http://www.cublog.cn/u/6303/showart_472641.html 有关于这个问题的详细的解释。

 

通过这个问题,也说明了,linux2.4.19之前的版本 对进程间的读写锁支持是有问题的,或者说是不支持的。

 

另外http://www.ibm.com/developerworks/cn/linux/porting/solaris/guide1/index.html中提到的:

要使用 POSIX 线程的 read/write lock 扩展,您必须在编译时定义:

_XOPEN_SOURCE=500

这要在加入 <pthread.h> 头文件之前完成,还要定义:

_POSIX_C_SOURCE=199506L

Linux 线程不实现共享进程的互斥、条件和信号。该扩展的目的是允许不同的进程(有不同地址空间的进程)在共享内存中(SVR4 共享内存片段或映射的 mmap() 文件)分配的互斥、条件或信号之间进行同步。"

 

按照上面的操作也是不支持的,必须需要内核的配合才行。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值