gpt4 book ai didi

c - Linux 上 C 中的 POSIX 线程和全局变量

转载 作者:IT王子 更新时间:2023-10-29 00:33:14 27 4
gpt4 key购买 nike

如果我有两个线程和一个全局变量(一个线程不断循环读取变量;另一个不断循环写入变量)会发生什么不该发生的事情吗? (例如:异常、错误)。如果是,请采取什么方法来防止这种情况发生。我正在阅读有关互斥锁的信息,它们允许一个线程独占访问一个变量。这是否意味着只有该线程可以读取和写入它而没有其他线程?

最佳答案

Would anything happen that shouldn't?

这部分取决于变量的类型。例如,如果变量是一个字符串(长字符数组),那么如果作者和读者同时访问它,那么读者将看到什么是完全不确定的。

这就是 pthreads 提供互斥锁和其他协调机制的原因。

Does this mean that only that thread can read and write to it and no other?

互斥锁确保最多一个使用互斥锁的线程可以获得继续执行的权限。使用相同互斥锁的所有其他线程将被暂停,直到第一个线程释放互斥锁。因此,如果代码编写得当,任何时候,只有一个线程能够访问该变量。如果代码写的不对,那么:

  • 一个线程可能会在不检查它是否有权这样做的情况下访问变量
  • 一个线程可能会获得互斥量并且永远不会释放它
  • 一个线程可能会在不通知另一个线程的情况下销毁互斥量

这些都不是理想的行为,但互斥体的存在并不能阻止任何这些行为的发生。

不过,您的代码可以合理地谨慎使用互斥体,然后对全局变量的访问将得到适当控制。虽然它通过互斥体获得许可,但任何一个线程都可以修改变量,或者只读取变量。任何一个都不会受到另一个线程的干扰。

关于c - Linux 上 C 中的 POSIX 线程和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9696923/

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