robust-futex-2-实验
一、用户空间使用实验
1. 测试代码
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <sys/mman.h> #include <linux/futex.h> #include <sys/syscall.h> #include <errno.h> #include <stdint.h> /* ARM64 强制 8 字节对齐 */ __attribute__((aligned(8))) pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // ARM64 优化的 robust list 注册 static void register_robust_list(volatile pthread_t self) { int ret; struct robust_list_head *head = (struct robust_list_head *)&mutex; ret = syscall(__NR_set_robust_list, head, sizeof(*head)); if (ret < 0) { printf("syscall set_robust_list failed!\n"); } } void* thread_func(void *arg) { // 注册线程的 robust list (ARM64 必须显式调用) register_robust_list(pthread_self()); // 尝试加锁 int rc = pthread_mutex_lock(&mutex); if (rc == EOWNERDEAD) { // 清理共享资源 printf("thread %lx: found orphaned mutex, clean resources...\n", (unsigned long)pthread_self()); // 标记状态一致 pthread_mutex_consistent(&mutex); // 解锁并重新获取 pthread_mutex_unlock(&mutex); pthread_mutex_lock(&mutex); } printf("child thread %lx entered critical section.\n", (unsigned long)pthread_self()); // 模拟崩溃(ARM64 非法指令) //asm volatile(".word 0x00000000"); // 触发 SIGILL ==>实测无法成功 //exit(0); //主线程好像也会退出 //pthread_mutex_unlock(&mutex); // 等待主线程被锁阻塞 sleep(2); printf("child thread %lx exit.\n", (unsigned long)pthread_self()); return NULL; } int main() { // 配置 robust 属性 (ARM64 需要显式设置) pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setrobust(&attr, PTHREAD_MUTEX_ROBUST); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_PRIVATE); // 重新初始化 mutex pthread_mutex_init(&mutex, &attr); // 检查对齐 (ARM64 关键步骤) if (((uintptr_t)&mutex) % 8 != 0) { fprintf(stderr, "Mutex not 8-byte aligned!\n"); exit(EXIT_FAILURE); } pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); // 等待子线程先获取锁 sleep(1); printf("main thread try get lock\n"); // 主线程尝试获取锁 int rc = pthread_mutex_lock(&mutex); if (rc == EOWNERDEAD) { // 清理资源 printf("main thread recovery triggered, cleaning resources...\n"); pthread_mutex_consistent(&mutex); pthread_mutex_unlock(&mutex); // 重新获取 pthread_mutex_lock(&mutex); } printf("main thread entered critical section\n"); pthread_mutex_unlock(&mutex); pthread_join(tid, NULL); return 0; }
2. 测试结果
(1) X86-Ubuntu-kernel5.4
~/file_161/4.c_test/19.futex$ gcc robust_futex_demo.c -o pp -lpthread sunfl@xiaopeng-PowerEdge-R730:~/file_161/4.c_test/19.futex$ ./pp child thread 7f8882849700 entered critical section. main thread try get lock child thread 7f8882849700 exit.
也即没有成功!
(2) Arm64 A10 msm-4.14
robust_demo.c:34:3: error: implicit declaration of function 'pthread_mutex_consistent' is invalid in C99 robust_demo.c:59:2: error: implicit declaration of function 'pthread_mutexattr_setrobust' is invalid in C99 robust_demo.c:59:37: error: use of undeclared identifier 'PTHREAD_MUTEX_ROBUST' robust_demo.c:83:9: error: implicit declaration of function 'pthread_mutex_consistent' is invalid in C99
glibc库还不支持这些函数。
3. 小结
实测,A10中所有任务的 if (p->robust_list || p->compat_robust_list) 全为假,说明没有一处使用 robust futex.
参考:
phtread与robust互斥锁(上篇,用户态视角):https://zhuanlan.zhihu.com/p/612904421
phtread与robust互斥锁(下篇,内核态视角):https://zhuanlan.zhihu.com/p/613102597
posted on 2025-05-21 18:39 Hello-World3 阅读(17) 评论(0) 收藏 举报