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)    收藏  举报

导航