在以下伪c程序中:
int shared;
pthread_barrier_t b;
// Thread 1
shared = 42;
pthread_barrier_wait(&b);
// Thread 2
pthread_barrier_wait(&b);
int v = shared;
printf("shared = %d\n", v);
POSIX标准是否确保线程2始终打印42? (我在X86上运行这个程序) 我花了一些时间阅读内存一致性模型(TSO for X86)和缓存一致性协议,我想知道我的问题的答案是否是肯定的,如NPTL的pthread实现如何保证?如果答案是否定的,我该怎么做以确保始终打印42?
此外,我感兴趣的是在手动编写这种屏障(一个旋转的屏障)的解决方案中的学习目的,保证在屏障之前在屏障1之前写入的值总是在屏障之后被线程2看到。
答案 0 :(得分:2)
是的,只要您正确地初始化屏障,计数为2
记录的函数here充当完整的内存(和编译器)障碍,这意味着在调用这些函数之前执行的内存存储/加载在这些函数之后对其他线程可见。 (并且内存加载/存储不会在这些调用之间移动)
答案 1 :(得分:1)
在创建线程之前,应该使用线程数初始化结构。
#define THREADS 2
pthread_barrier_init(&b, NULL, THREADS)
此时,pthread
将确保两个帖子都不会从pthread_barrier_wait(&b);
返回,直到它们都已到达,因此您应该看到42
已打印。