C++ Pthread读写锁问题

C++ Pthread读写锁问题,c++,c,multithreading,synchronization,pthreads,C++,C,Multithreading,Synchronization,Pthreads,请检查下面的代码示例。很明显,一个线程可以为读锁锁定对象,另一个线程可以解锁对象,然后获得写锁。读写锁定的代码为(检查函数_pthread\u rwlock\u unlock)。我的问题是,为什么选择这种行为?基本上,当一些线程已经在“锁”上获得读锁时,任何线程都可以解锁“锁”。可能是出于性能考虑,程序员在这里做正确的事情是值得信赖的。我正在创建一个分布式锁服务,并正在经历pthread锁的实现 #include <pthread.h> #include <stdio

请检查下面的代码示例。很明显,一个线程可以为读锁锁定对象,另一个线程可以解锁对象,然后获得写锁。读写锁定的代码为(检查函数_pthread\u rwlock\u 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;
    }
#包括
#包括
#包括
pthread_rwlock_t rwlock;
void*fun(void*arg)
{
printf(“线程创建\n”);
int rc=pthread\u rwlock\u unlock(&rwlock);
如果(rc==0)
printf(“I unlocked thread_id=%lu\n”,(long unsigned int)pthread_self());
rc=pthread\u rwlock\u wrlock(&rwlock);
如果(rc==0)
printf(“获取rwlock写入线程\u id=%lu\n”,(长无符号int)pthread\u self();
}
int main()
{
int rc;
rc=pthread\u rwlock\u rdlock(&rwlock);
如果(rc==0)
printf(“get read lock thread_id=%lu\n”,(long unsigned int)pthread_self());
睡眠(2);
pthread_t tid;
pthread_create(&tid,0,fun,0);
睡眠(34);
返回0;
}

保存持有读锁的所有线程的列表代价太高。尤其是今天,很多代码都希望能够保存数千个(如果不是数百万个)读锁。锁的速度预计会非常快


POSIX本身说,调用
pthread\u rwlock\u unlock
的线程没有获得的锁的解锁行为是未定义的。因此,从技术上讲,您的代码是错误的,但是我不认为任何人会费心捕捉到这个错误,除非您在一些繁重而缓慢的调试模式下运行。

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

这基本上是为了让编写者比读者更受欢迎,以避免编写者饥饿。感谢回复。我认为这种方法适用于进程内锁。对于分布式锁定系统,这种方法不合适。是@NipunTalukdar,如果调用线程不持有锁,则结果是未定义的。互斥锁或条件变量是处理多线程环境中的关键部分(锁定/解锁)的良好同步和/或IPC机制。如果它是写锁定的,则只有锁所有者线程可以解锁。如果其他线程尝试解锁,则会出现EPERM错误。2.如果它被读锁定,任何线程都可以“解锁”它。解锁读锁转换为递减计数。如果计数为零,而某些线程仍试图解锁它,则EPERM会再次出错。@NipunTalukdar:这只是实现的一个怪癖-您仍在违反约定,因此允许它执行任何操作(包括减少使用计数)。我想我误解了你们的问题——若你们想知道为什么这个错误案例并没有被特别检查和处理,这是因为你们不能在使用有限的空间时保留一个拥有线程的列表。