使用pthread_barrier_wait确保可变可见性吗?

时间:2014-04-09 20:50:02

标签: c pthreads sync

在以下伪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看到。

2 个答案:

答案 0 :(得分:2)

是的,只要您正确地初始化屏障,计数为2

记录的函数here充当完整的内存(和编译器)障碍,这意味着在调用这些函数之前执行的内存存储/加载在这些函数之后对其他线程可见。 (并且内存加载/存储不会在这些调用之间移动)

答案 1 :(得分:1)

在创建线程之前,应该使用线程数初始化结构。

#define THREADS 2
pthread_barrier_init(&b, NULL, THREADS)

此时,pthread将确保两个帖子都不会从pthread_barrier_wait(&b);返回,直到它们都已到达,因此您应该看到42已打印。