请检查下面的代码示例。很明显,一个线程可以将对象锁定为读锁,另一个线程可以解锁该对象,然后可以获得写锁。读写锁的代码是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;
}发布于 2015-03-12 21:04:12
保留持有读锁的所有线程的列表太昂贵了。尤其是在今天,当许多代码都希望能够持有数千个读锁的时候。锁预计会非常快。
POSIX本身表示,解锁调用pthread_rwlock_unlock的线程没有获得的锁的行为是未定义的。所以从技术上讲,你的代码是错误的,但我认为没有人会费心去捕捉这个错误,除非你在一些繁重而缓慢的调试模式下运行。
发布于 2015-03-12 21:14:29
您只是错误地使用了锁。线程解锁当前未持有的锁是一种未定义的行为。
https://stackoverflow.com/questions/29010019
复制相似问题