gpt4 book ai didi

c - 全局/本地/静态互斥锁的区别?

转载 作者:行者123 更新时间:2023-12-03 12:44:09 25 4
gpt4 key购买 nike

互斥锁用于防止两个或多个线程同时访问同一个资源(文件、变量等)。这可以防止发生竞争条件。
每个线程都有自己的堆栈。这意味着当一个线程调用一个函数时,该线程将拥有该函数中定义的局部变量的唯一副本。但是如果局部变量定义为 static ,只会创建此变量的一个副本,并且所有线程都将访问此副本。

  • 这是否意味着 本地 非- static互斥锁没用?
  • 可否static本地互斥锁有用吗?也许是为了守卫static局部变量?
  • 如何定义 全局互斥体为 static有所作为?
  • 最佳答案

    非静态本地互斥锁仍然有用:如果您有一个主线程创建其他线程并等待它们完成,则互斥锁可以是主线程中的一个局部变量,它会传递一个指向该互斥锁的指针到其他线程。这只有在保证主线程比其他线程生命周期更长的情况下才有效。
    如果互斥变量声明为 static在您的线程函数中,它将在使用此函数的不同线程之间共享,并且它们可以将其用于同步。这是因为 static变量与全局变量具有相同的生命周期(并且只有一个唯一副本)。但是,这仅在您的线程库不需要函数调用来初始化互斥锁的情况下才有效,因为没有进行初始化的好地方。
    另一种选择是动态分配互斥锁,或者更常见的是,将其作为动态分配结构的成员。然后,您可以将指向互斥体(或包含结构)的指针传递给所有需要它的线程。
    至于你的最后一个问题:Defining a global variable as static意味着它只在当前翻译单元中可见。它不会影响其生命周期,因此对于此用例,其工作方式与非静态全局变量类似(只要您只需要在一个 .c 文件中访问它)。

    关于c - 全局/本地/静态互斥锁的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62829474/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com