【发布时间】:2023-01-18 20:16:42
【问题描述】:
我正在使用 Ubuntu 20.04 并遇到了一个奇怪的问题。在我的代码中,如果在初始化 pthread_rwlock_t 对象之后有任何机会pthread_rwlock_unlock之前调用函数pthread_rwlock_wrlock在同一个线程中,执行块。 这是重现问题的示例代码
#include <stdio.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int main() {
pthread_rwlock_init(&rwlock, NULL);
pthread_rwlock_unlock(&rwlock);
pthread_rwlock_wrlock(&rwlock); //Blocks indefinitely
}
但是一旦调用 wrlock 然后调用 unlocked 就不会发生这种情况。例如
#include <stdio.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int main() {
pthread_rwlock_init(&rwlock, NULL);
pthread_rwlock_wrlock(&rwlock);
pthread_rwlock_unlock(&rwlock);
pthread_rwlock_unlock(&rwlock);
pthread_rwlock_wrlock(&rwlock); //Doesn't Block even though unlock is called twice
}
【问题讨论】:
-
不知道发生了什么。但我有一个问题,你为什么要使用 pthreads?和 std::thread(或 std::async)和内置的读/写锁。 std::shared_lock, std::unique_lock + std::mutex,.使用这些原语的优势:标准 C++ 和 unique_lock/shared_lock 是 RAII 对象,因此当它们超出范围时总是解锁(异常安全)。