【问题标题】:Are static inline functions thread safe?静态内联函数是线程安全的吗?
【发布时间】:2016-10-19 08:16:12
【问题描述】:

场景:我写了一大段代码,运行在 2 个并行线程上,它们在代码方面是相同的,只是处理不同的数据。我看到了不确定的结果。如果我禁用 2 个线程之一,结果将变得确定。在这段代码中,我使用了一些静态内联函数(主要原因:它们是我在这里和那里需要的小函数,为此我只是在需要它们的翻译单元中复制代码),我想了解它们是否可能是我的问题的一个原因。

C 中的静态内联函数是线程安全的吗?反过来说,如果它们内部没有静态变量,而只有一些局部变量和输入参数,那么来自 2 个线程的同时调用会导致不可预知的行为吗?

【问题讨论】:

  • 不是线程安全的东西是可以改变的。代码不会改变(在正常情况下),但变量经常会。

标签: c multithreading thread-safety


【解决方案1】:

不,那真的应该没问题。

函数是否内联不应该影响这一点,因为无论如何它都只是代码。

就实际的内存数据(结果)而言,行为是不确定的,还是“只是”诸如事件的时间和顺序之类的东西?

您是否可能会写入参数,不小心造成数据竞争?

【讨论】:

  • 结果不同。我确实写入了参数,但它们对于 2 个线程来说是不同的地址,或者是另一个函数的本地变量地址,所以我想它应该是安全的。您是否有可能导致数据竞争的代码的快速示例?
  • “另一个函数的局部变量地址”?不是线程的父函数,我希望?当然,这会使两个线程中的地址相同。但很明显,我只是在这里盲目地走在黑暗中。
  • @Antonio 您可能会遇到内联代码时触发不同的竞争条件,因为如果代码被内联,它可能会稍微快一些,因此可能会以不同方式触发竞争条件。
  • @MichaelWalz 我不明白你的说法。在我的例子中,线程只共享代码,而不是数据,而且我看不出可能会触发哪个竞赛。
  • @Antonio 好的,我误解了一些东西。无视评论。
【解决方案2】:

静态内联函数在 C 中是线程安全的吗?

是的。静态内联函数对线程安全没有影响。但是如果你使用的是静态变量,那么你必须小心。

如果它们内部没有静态变量,而只有一些局部变量 和输入参数,将同时从 2 个线程调用 导致不可预测的行为?

如果您使用的是局部变量,那么您不会有任何问题。 因为每个线程都有自己的栈内存。

【讨论】:

    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    相关资源
    最近更新 更多