让我确保我理解C pthread互斥体

让我确保我理解C pthread互斥体,c,pthreads,mutex,C,Pthreads,Mutex,我有一个全局变量flag、一个函数this()、一个函数this()。现在,main()。要正确使用互斥,我需要: 声明一个pthread\u mutex\t并初始化它 为this()和that()和pthread\u join()创建线程,因为我希望main()在退出之前等待this()和that()完成 在代码中的任何地方,无论是main(),this(),还是that(),在读取或写入flag的地方,调用pthread\u mutex\u lock()然后调用[read/write]fla

我有一个全局变量
flag
、一个函数
this()
、一个函数
this()
。现在,
main()。要正确使用互斥,我需要:

  • 声明一个
    pthread\u mutex\t
    并初始化它
  • this()
    that()
    pthread\u join()
    创建线程,因为我希望
    main()
    在退出之前等待
    this()
    that()
    完成
  • 在代码中的任何地方,无论是
    main()
    this()
    ,还是
    that()
    ,在读取或写入
    flag
    的地方,调用
    pthread\u mutex\u lock()
    然后调用[read/write]
    flag
    ,然后调用
    pthread\u mutex\u unlock()
  • 对吗

    我不打算这样做,但如果我想在
    main()
    中的无限循环中检查
    flag
    ,如下所示:

        while(flag != value)
            continue;
    
    您将在哪里
    lock()
    unlock()
    互斥锁,其他线程是否有机会访问
    flag
    ,并且
    main()
    始终像这样在互斥锁上运行?

    1-2-3-正确

    现在,如果你写了那个循环,那么

    • 作为3的结果,主线程将持有锁,而其他线程将无法获取锁,因此实际上,您创建了一个无限循环
    • 如果不锁定,那么它可能无法工作,这取决于CPU体系结构(首先,
      标志
      需要是原子可更新的,其他内核需要看到这些更改。并非所有体系结构都能保证这一点)。即使它能工作,它仍然是一个繁忙的等待循环,不应该被使用
    正如Ben在评论中指出的,您希望使用条件变量来发送信号(注意:)

    在哪里锁定()和解锁()互斥锁


    根据经验,为了最小化争用,请尽可能短地保持锁。这可以像lock+read+unlock一样简单,但如果以下操作顺序取决于不应更改标志这一事实,则根据需要保留锁。

    最后一个循环需要一个pthread条件。请使用pthread对象来实现它们的目的。互斥锁保护对某个(或多个)对象的访问,而条件变量用于向一个或多个潜在的相关方发出谓词更改的信号。正确地配合使用,您所阐述的任务既优雅,又相当琐碎。谢谢。这或多或少就是我的想法,只是想在我第一次尝试互斥之前确定我已经掌握了它的要点。我反复阅读手册页,并查看了来自不同来源的几个示例,最后我仍然不确定自己是否掌握了它@WhozCraig——对于像我这样的新手、自学成才的家伙来说,这是件很沉重的事情;)