C - 管道访问和互斥锁可能存在的重新排序问题

C - possible reordering issue with pipe access and mutex

提问人:Itay Bianco 提问时间:11/15/2023 更新时间:11/15/2023 访问量:9

问:

在通过调用初始化后write_fd我有 2 个线程在运行:pipe()

static bool finished = false;

线程 1

pthread_mutex_lock(&lock);
if (!finished) {
    write(write_fd, buf, buf_len);
}
pthread_mutex_unlock(&lock);

线程 2

pthread_mutex_lock(&lock);
finished = true;
pthread_mutex_unlock(&lock);
close(write_fd);

问题是编译器/CPU 是否有可能以在互斥锁之前移动的方式对线程 2 中的指令重新排序?close(write_fd)

如果是这样,这可能会产生问题,因为线程 1 可能会写入关闭的 fd,或者更糟糕的是,可能会为其他一些代码分配相同的 fd,而线程 1 将写入错误的位置。

这是我的代码中发生的情况的简化形式。可以做些什么来确保在线程 2 中解锁后发生,而无需实际将代码移动到互斥锁保护区域?通过另一个函数调用会吗?closeclose

多线程 管道 互斥 指令重新排序

评论


答: 暂无答案