多个线程同时调用同一个函数是否安全?

25

例如这样做是否安全?

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


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

}

如果有4个线程同时进行这个操作,这样做是否安全?谢谢


我只是举个例子,我知道这不是“正确”的。 - jmasterx
5个回答

27

这个函数本身是安全的,但如果它们都试图操作同一个变量,那么就会变得危险。


你的意思是函数调用中使用了不属于该函数的变量,比如AddTwo修改了一个全局变量? - jmasterx
3
没问题。我在谈论地址“num”所引用的内容,而不是“num”本身。你尝试从多个线程修改全局变量的例子就是其中的问题之一。 - Shirik
好的,我的应用程序将会分配工作,所以这不应该是个问题,谢谢! - jmasterx

4

通常来说,如果一个函数不改变任何共享资源(例如相同的内存位置),它就是可重入的。如果它改变了共享资源,你需要使用某种同步机制,比如互斥锁或信号量。


2

从不同的线程调用相同的函数并没有问题。如果您想确保变量的一致性,建议提供线程同步机制以防止崩溃和竞态条件。


1

安全性取决于 lpvoid arg 的值。

如果所有的参数彼此不同,则是安全的,否则就不安全。

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


1

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

在大多数平台上,只要您在其他人提到的函数中不执行任何不安全的操作,就是安全的。但很容易出错,所以要小心!

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

总的来说,通常情况下是安全的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接