首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pthread读写锁问题

Pthread读写锁问题
EN

Stack Overflow用户
提问于 2015-03-12 20:40:16
回答 2查看 640关注 0票数 0

请检查下面的代码示例。很明显,一个线程可以将对象锁定为读锁,另一个线程可以解锁该对象,然后可以获得写锁。读写锁的代码是here (检查函数__pthread_rwlock_unlock)。我的问题是,为什么选择这种行为?基本上,当一些线程已经在“锁”上获得读锁时,任何线程都可以解锁“锁”。这可能是出于性能方面的考虑,并且相信程序员会在这里做正确的事情。我正在创建一个分布式锁服务,并且正在进行pthread锁的实现。

代码语言:javascript
复制
 #include <pthread.h>
    #include <stdio.h>
    #include <unistd.h>

    pthread_rwlock_t       rwlock;
    void *fun(void *arg)
    {
      printf("Thread created\n");
      int rc = pthread_rwlock_unlock(&rwlock);
      if (rc == 0)
        printf("I unlcoked thread_id=%lu\n", (long unsigned int)pthread_self());
      rc = pthread_rwlock_wrlock(&rwlock);
      if (rc == 0)
        printf("got the rwlock write thread_id=%lu\n", (long unsigned int)pthread_self());

    }

    int main()
    {
      int rc;

      rc = pthread_rwlock_rdlock(&rwlock);
      if (rc == 0)
      printf("Got read lock thread_id=%lu\n", (long unsigned int)pthread_self());

      sleep(2);
      pthread_t tid;
      pthread_create(&tid, 0, fun, 0);
      sleep(34);

      return 0;
    }
EN

回答 2

Stack Overflow用户

发布于 2015-03-12 21:04:12

保留持有读锁的所有线程的列表太昂贵了。尤其是在今天,当许多代码都希望能够持有数千个读锁的时候。锁预计会非常快。

POSIX本身表示,解锁调用pthread_rwlock_unlock的线程没有获得的锁的行为是未定义的。所以从技术上讲,你的代码是错误的,但我认为没有人会费心去捕捉这个错误,除非你在一些繁重而缓慢的调试模式下运行。

票数 1
EN

Stack Overflow用户

发布于 2015-03-12 21:14:29

您只是错误地使用了锁。线程解锁当前未持有的锁是一种未定义的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29010019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档