【问题标题】:Is it safe for multiple threads to call the same function?多个线程调用同一个函数是否安全?
【发布时间】:2010-07-05 05:05:00
【问题描述】:

例如这样做是否安全:

void AddTwo(int &num)
{
  num +=2;
}


void ThreadProc(lpvoid arg)
{
AddTwo((int)arg);

}

如果 4 个线程同时执行此操作是否安全?谢谢

【问题讨论】:

  • 我只是举个例子,我知道这不是'正确'

标签: c++ c multithreading


【解决方案1】:

函数本身可以安全调用。如果他们都试图对同一个变量进行操作,那就很危险了。

【讨论】:

  • 你的意思是一个变量不是被正确调用的函数的一部分,比如 AddTwo 修改了一个全局变量?
  • 正确。我说的是地址“num”引用,而不是“num”本身。您尝试从多个线程修改全局变量的示例是问题案例之一。
  • 好的,我的应用程序将分配工作,所以这应该不是问题,谢谢!
【解决方案2】:

作为一般经验法则,如果函数不改变任何公共资源(例如相同的内存位置),则它是可重入的。如果是这样,您需要使用某种同步机制,例如互斥锁或信号量。

【讨论】:

    【解决方案3】:

    从不同线程调用同一个函数并没有错。如果你想确保你的变量是一致的,建议提供线程同步机制来防止崩溃、竞态条件。

    【讨论】:

      【解决方案4】:

      安全取决于 lpvoid arg 的值。

      如果所有 args 彼此不同,则安全,否则不安全。

      要使函数调用安全,请查看“互斥锁”。

      【讨论】:

        【解决方案5】:

        真正的答案是 - 这取决于...

        在大多数平台上,是的,只要您不在其他人提到的功能中做任何不安全的事情,它就是安全的。很容易搞砸所以要小心!

        在其他平台上,这绝对是不安全的。例如,由于硬件限制,大多数小型 PIC 微控制器的 C 编译器都不能支持这一点。

        一般来说,是的,但它是安全的。

        【讨论】:

          猜你喜欢
          • 2011-07-14
          • 1970-01-01
          • 1970-01-01
          • 2020-12-17
          • 1970-01-01
          • 2017-07-15
          • 1970-01-01
          • 2013-05-10
          • 1970-01-01
          相关资源
          最近更新 更多