C++ pthread_mutex_lock是否在语义之前发生
threadA请仔细阅读此代码段C++ pthread_mutex_lock是否在语义之前发生,c++,multithreading,synchronization,happens-before,C++,Multithreading,Synchronization,Happens Before,threadA请仔细阅读此代码段 { global_a = 100; // 1 { pthread_mutex_lock(&b_mutex) ... pthread_mutex_unlock(&b_mutex) } // 2 } { { pthread_mutex_lock(&b_mutex) ... pth
{
global_a = 100; // 1
{
pthread_mutex_lock(&b_mutex)
...
pthread_mutex_unlock(&b_mutex)
} // 2
}
{
{
pthread_mutex_lock(&b_mutex)
...
pthread_mutex_unlock(&b_mutex)
} // 3
int tmp = global_a; // 4
}
threadB浏览这个片段
{
global_a = 100; // 1
{
pthread_mutex_lock(&b_mutex)
...
pthread_mutex_unlock(&b_mutex)
} // 2
}
{
{
pthread_mutex_lock(&b_mutex)
...
pthread_mutex_unlock(&b_mutex)
} // 3
int tmp = global_a; // 4
}
假设从观察者的角度来看,执行顺序确实是
“int tmp=global_a;”
处的代码是否可以查看threadA在“global_a=100;”
处设置了什么
欢迎任何建议。
pthread\u mutex\u lock
不会阻止之前的指令在它之后排序
类似地,pthread\u mutex\u unlock
也不会阻止在它之前订购遵循的指令
但是:
global\u a=100
中,在pthread\u mutex\u解锁(&b\u mutex)
之前发生pthread\u mutex\u lock(&b\u mutex)
中,在int tmp=global\u a代码>
pthread\u mutex\u unlock(&b\u mutex)
发生在线程b中的pthread\u mutex\u lock(&b\u mutex)
之前global_a=100线程中的代码>发生在inttmp=global\u a代码>在threadB中。最后一个可以看到第一个的效果
POSIX标准的内容:
至于POSIX标准中的同步细节,我找到的唯一参考资料(以及其他参考资料)是关于同步的简短章节。它表示pthread\u mutex\u lock
(以及其他一些函数)
与其他线程同步内存
有些人将此解释为完全记忆障碍担保,其他人(和我)更喜欢考虑一些经典担保,当锁定和等待动作提供记忆获取语义、解锁和通知语义时-记忆释放语义。例如,见本节
在POSIX中,没有在术语之前发生。但是它可以像往常一样定义,考虑到内存顺序保证(在一个人的解释中)。如果你能保证执行顺序-如果是的话。如果可以保证执行顺序,那么在某些体系结构上甚至不需要锁
Lock实际上要做三件事:
1.不允许同时执行不同的代码。看见这里没有提到记忆。它只是保证不同线程中的代码不会同时执行。
2.在某些体系结构上,它将插入缓存一致性指令。这迫使多处理器系统将数据刷新到实际内存中。但您不必担心这种情况,因为现在“如果对同一内存位置的所有写入都按某种顺序执行,则多处理器是缓存一致的”
3.它插入内存屏障指令。这是给处理器的,告诉它不要弄乱执行顺序
你也可以刹车。因此,将变量声明为volatile 在“So declare your variable as volatile.”的结尾,您的意思是threadB“int tmp=global_a;”看不到threadA设置为“global_a=100”的是什么;证据很好,但是使用pthread\u mutex\u lock
和pthread\u mutex\u unlock
之前发生的定义和传递在哪里?我用谷歌搜索了一下,但什么都没有。你能给我一些关于它的参考资料吗?我已经在我的答案中添加了一些参考资料。POSIX没有定义“发生在术语之前”,但可以根据内存顺序保证来定义。