金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  359 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
pthread_rwlock使用错误

写锁之后读锁竟然没有阻塞, 顺利运行下去了.
据常理,写锁之后,试图读加锁时会阻塞.

代码如:

pthread_rwlock_t rwl;
cout << "init: " << pthread_rwlock_init(&rwl, NULL) << endl;

cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl;
cout << "rdlock: " << pthread_rwlock_rdlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;

cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl;    // DEAD!
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;

输出为:
init: 0
wrlock: 0
rdlock: 35
unlock: 0
unlock: 0

程序会死锁在接下来的写锁定上. 35错误号为EDEADLK, 意为出现死锁.

仔细研究pthread读写锁的文档, 才发现原来如果一个线程写锁定后,
又调用pthread_rwlock_rdlock函数来读锁定,结果将无法预测。

Results are undefined if the calling thread currently owns a write lock on rwlock.

但是pthread_rwlock_rdlock()的man文档却对此没有明确指出.

参考:
读写锁 ( http://www.duangw.net/computer/history/pthread/rwlock.html )
pthread_rwlock_rdlock(3T) ( http://docs.hp.com/en/B2355-60103/pthread_rwlock_rdlock.3T.html )

不管怎样, pthread_rwlock_rdlock()都应该判断返回值,
因为有可能同时读太多会返回EAGAIN.

这样pthread_rwlock使用起来就麻烦许多.
查看了boost::thread, 它好像就没用pthread的读写锁.

(转载请注明来源于金庆的专栏)


posted on 2008-11-14 10:47 金庆 阅读(4415) 评论(1)  编辑 收藏 引用 所属分类: 1. C/C++4. Linux/Unix

评论

# re: pthread_rwlock使用错误 2013-12-01 23:57 xuanflyer
不过wrlock和rdlock分别在不同的线程的话不会出现这样的问题,好奇怪。。。  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理