Pthread读写锁定问题

时间:2015-03-12 12:40:16

标签: c++ c multithreading synchronization pthreads

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

 #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;
    }

2 个答案:

答案 0 :(得分:1)

保留包含读锁定的所有线程的列表太昂贵了。特别是在今天,许多代码希望能够容纳数千甚至数百万的读锁。并且预计锁会非常快。

POSIX本身表示解锁锁定的行为,即调用pthread_rwlock_unlock的线程无法获取。从技术上讲,你的代码是错误的,但我不认为除非你在一些沉重和缓慢的调试模式下运行,否则任何人都会抓住这个错误。

答案 1 :(得分:1)

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