pthread_rwlock使用错误
2008-11-14 10:43
399 查看
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的读写锁.
(转载请注明来源于金庆的专栏)
写锁之后读锁竟然没有阻塞, 顺利运行下去了.
据常理,写锁之后,试图读加锁时会阻塞.
代码如:
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的读写锁.
(转载请注明来源于金庆的专栏)
相关文章推荐
- pthread_rwlock使用错误
- 读写锁pthread_rwlock_t的使用(转)
- 读写锁pthread_rwlock_t的使用
- linux下错误使用pthread_mutex_lock导致程序奔溃问题分析
- linux使用读写锁pthread_rwlock_t
- linux使用读写锁pthread_rwlock_t
- Ubuntu下使用Eclipse编译pthread程序错误undefined reference to `pthread_create'
- linux使用读写锁pthread_rwlock_t
- 读写锁pthread_rwlock_t的使用
- qt中使用pthread的undefined错误
- linux使用读写锁pthread_rwlock_t
- pthread_rwlock读写锁的使用细节
- 读写锁pthread_rwlock_t的使用
- linux使用读写锁pthread_rwlock_t
- linux使用读写锁pthread_rwlock_t
- 使用Tair时遇到pthread_join段错误问题解决
- linux使用读写锁pthread_rwlock_t
- pthread_rwlock读写锁的使用细节
- Linux应用程序错误使用pthread_mutex_lock互斥锁触发SIG_ABRT信号的原因分析
- 读写锁pthread_rwlock_t的使用