C++ pthread_mutex_lock是否在语义之前发生

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

threadA请仔细阅读此代码段

{
    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
}
假设从观察者的角度来看,执行顺序确实是

  • 线程A---1
  • 线程A---2
  • 螺纹B---3
  • 线程B--4
  • threadB
    “int tmp=global_a;”
    处的代码是否可以查看threadA在
    “global_a=100;”
    处设置了什么


    欢迎任何建议。

    pthread\u mutex\u lock
    不会阻止之前的指令在它之后排序

    类似地,
    pthread\u mutex\u unlock
    也不会阻止在它之前订购遵循的指令

    但是:

  • 在threadA
    global\u a=100
    中,在
    pthread\u mutex\u解锁(&b\u mutex)
    之前发生

  • 在threadB
    pthread\u mutex\u lock(&b\u mutex)
    中,在
    int tmp=global\u a

  • 如果你观察到

  • 线程A中的
    pthread\u mutex\u unlock(&b\u mutex)
    发生在线程b中的
    pthread\u mutex\u lock(&b\u mutex)
    之前
  • (换句话说,threadA释放它后threadB获取锁定),然后

    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没有定义“发生在术语之前”,但可以根据内存顺序保证来定义。