`
yesjavame
  • 浏览: 712520 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

pthread_rwlock使用错误

阅读更多
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的读写锁.

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

分享到:
评论

相关推荐

    pthreads_pthread_

    6. `pthread_rwlock_t` 和 `pthread_rwlock_init() / pthread_rwlock_rdlock() / pthread_rwlock_wrlock() / pthread_rwlock_unlock() / pthread_rwlock_destroy()`:读写锁,允许多个读取者同时访问,但写入者独占...

    Posix(1).rar_POSIX Pthread_posix_pthread_pthread posix

    4. **同步机制**:pthreads提供多种同步原语,包括互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、读写锁(`pthread_rwlock_t`)和信号量(`sem_t`),用于控制对共享资源的访问。 5. **线程调度**:...

    Linux系统编程之线程同步

    int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr); 参2:attr表读写锁属性,通常使用默认属性,传NULL即可。 pthread_rwlock_destroy函数 销毁一把读写锁...

    同步 读写锁 readwriteLock

    使用 `pthread_rwlock_init` 函数初始化这个变量,该函数接受一个指向读写锁的指针以及一个可选的属性对象指针。如果属性对象指针为空,则使用默认属性进行初始化。 ```c int pthread_rwlock_init(pthread_...

    windows和linux读写锁C++实现

    在Linux环境中,我们可以使用POSIX线程库(pthread)提供的`pthread_rwlock_t`类型来创建读写锁。下面是一个Linux下的C++实现: ```cpp #include &lt;pthread.h&gt; class RWLock { private: pthread_rwlock_t lock; ...

    pthreads-w32-2-9-1-release.zip

    在pthreads-w32库中,我们可以使用`pthread_mutex_init`、`pthread_rwlock_init`等函数初始化相应的同步对象,再配合`pthread_mutex_lock`、`pthread_rwlock_rdlock`、`pthread_rwlock_wrlock`进行锁定,以及`...

    超多的linux线程编程的书籍

    7. `pthread_rwlock_t` 和 `pthread_rwlock_rdlock() / pthread_rwlock_wrlock() / pthread_rwlock_unlock()`:读写锁,允许多个读线程同时访问,但写线程独占。 除了pthread库,Linux还提供了其他线程相关的系统...

    pthread.zip_C++_pthread windows

    4. 错误处理:pthread库的所有函数都会在失败时返回非零值,可以通过检查返回值来处理错误。 在Windows平台上,由于原生的线程API(如CreateThread)与pthread库不同,需要使用pthreads-win32这样的库来进行移植。...

    Linux下的多线程编程 (2).pdf

    【Linux下的多线程编程】是指在Linux操作系统中利用多线程...总之,Linux下的多线程编程涉及线程创建、同步、互斥和死锁避免等多个方面,通过合理使用pthread库提供的函数,可以有效地编写出高效、稳定的多线程程序。

    LINUX多线程

    3. `pthread_exit()`:当线程完成其任务或遇到错误时,使用此函数退出。可以传递一个退出状态码,供其他线程使用`pthread_join()`获取。 4. `pthread_cancel()`:允许一个线程被取消。这在某些情况下是有用的,例如...

    POSIX线程程序设计

    用`pthread_rwlock_init()`, `pthread_rwlock_rdlock()`, `pthread_rwlock_wrlock()`, 和 `pthread_rwlock_unlock()`进行操作。 四、线程取消与退出 1. 线程取消:通过`pthread_cancel()`函数可以请求取消另一个...

    linuxduoxiancheng.rar_Linux下 线程_linux 多线程_linux多线程

    `pthread_rwlock_init`初始化读写锁,`pthread_rwlock_rdlock`和`pthread_rwlock_wrlock`进行读写锁定。 四、线程的销毁和控制 当线程完成任务后,可以使用`pthread_exit`退出线程。主线程或其他线程可以通过`...

    Linux多线程-相关手写笔记

    `pthread_rwlock_init()`和`pthread_rwlock_rdlock()`/`pthread_rwlock_wrlock()`/`pthread_rwlock_unlock()`进行读写锁的控制。 3. **条件变量(Condition Variables)**:条件变量用于线程间的同步,线程可以在...

    基于posix多线程编程指南

    `pthread_rwlock_rdlock()`和`pthread_rwlock_wrlock()`分别用于读写锁定,`pthread_rwlock_unlock()`解锁。 4. **信号量**:POSIX提供两种类型的信号量,二进制信号量和计数信号量,用于限制资源的并发访问。 **...

    POSIX Pthread 编程资料大全

    5. `pthread_rwlock_*`:读写锁,允许多个读线程同时访问,但写线程独占资源。 6. `pthread_cond_*`:条件变量,用于线程间的协作和等待特定条件发生。 7. `pthread_barrier_*`:屏障,确保一组线程同时到达特定点。...

    unix环境下的线程库实现

    - **读写锁(Read-Write Locks)**:`pthread_rwlock_t`支持多个读者同时访问或一个写者独占访问。 5. **线程调度**:Unix允许自定义线程调度策略,如抢占式调度和非抢占式调度。`pthread_setschedparam()`和`...

    Linux C 线程

    例如,`printf()`不是线程安全的,而`pthread_mutex_lock()`和`pthread_rwlock_rdlock()`是线程安全的。 9. **死锁** 线程间的资源竞争可能导致死锁,当两个或更多线程互相等待对方释放资源时发生。避免死锁的关键...

    pthread-prebuilt-dll-2-9-1-release

    4. **线程同步**:pthread库提供了多种同步机制,如互斥锁(`pthread_mutex_t`)、条件变量(`pthread_cond_t`)、读写锁(`pthread_rwlock_t`)等,用于避免线程间的竞态条件,保证数据一致性。 5. **线程通信**:...

    posix pthread windows 实现

    - `pthread_rwlock_*()`: 读写锁,允许多个读取者同时访问资源,但只允许一个写入者。 **4. 多线程编程的关键点** - 资源共享:线程之间共享内存,必须使用同步机制(如互斥锁、信号量)来确保并发访问的安全性。 -...

    Programming with POSIX Threads 英文版+ 中文版+源码

    10. **错误处理**:了解`pthread`函数的错误返回值,如EAGAIN、EINVAL等,以及如何正确处理这些错误。 通过学习这本书,读者不仅可以掌握POSIX线程的基本用法,还能深入了解多线程编程中的各种挑战和解决方案,提高...

Global site tag (gtag.js) - Google Analytics