请检查以下代码示例。很明显,一个线程可以锁定对象以进行读锁定,另一个线程可以解锁它,然后可以获得写锁定。读写锁的代码是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;
}
答案 0 :(得分:1)
保留包含读锁定的所有线程的列表太昂贵了。特别是在今天,许多代码希望能够容纳数千甚至数百万的读锁。并且预计锁会非常快。
POSIX本身表示解锁锁定的行为,即调用pthread_rwlock_unlock
的线程无法获取。从技术上讲,你的代码是错误的,但我不认为除非你在一些沉重和缓慢的调试模式下运行,否则任何人都会抓住这个错误。
答案 1 :(得分:1)
您只是错误地使用了锁。它是一个未定义的行为,一个线程解锁它当前没有锁定的锁。