2010-07-05 109 views
16

它是安全的,例如做:多線程調用相同的函數是否安全?

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


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

} 

難道是安全的這如果4個線程是在同一時間做這種情況發生?謝謝

+1

'arg'從哪裏來? – 2010-07-05 05:06:47

+0

我只是做了這個作爲一個例子,我知道這不是'正確' – jmasterx 2010-07-05 05:09:30

回答

20

函數本身是安全的調用。如果他們都試圖對同一個變量進行操作,那麼就會變得危險。

+0

你的意思是一個變量不被稱爲正確的功能的一部分,就像如果AddTwo修改一個全局變量? – jmasterx 2010-07-05 05:09:07

+2

正確。我在說的是地址'num'引用,而不是'num'本身。您嘗試從多個線程修改全局變量的示例是問題之一。 – Shirik 2010-07-05 05:10:25

+0

好吧,我的應用程序將分割工作,所以這不應該是一個問題,謝謝! – jmasterx 2010-07-05 05:13:12

2

從不同的線程調用相同的函數沒有任何錯誤。如果你想確保你的變量是一致的,建議提供線程同步機制來防止崩潰和週轉情況。

1

安全取決於lpvoid arg的值。

如果所有參數彼此不同,則安全,否則不安全。

爲了使函數調用安全,請查看'互斥量'。

0

真正的答案是 - 這取決於...

在大多數平臺上,是的,它是安全的,只要你沒有做任何事情在其他人所說的功能是不安全的。這很容易搞砸,所以要小心!

在其他平臺上,它絕對是不安全的。例如,由於硬件限制,大多數較小型PIC微控制器的C編譯器都無法支持該編譯器。

一般來說,是的,但它是安全的。

1

作爲一般的經驗法則,如果函數不改變任何公共資源(例如相同的存儲器位置),則該函數是可重入的。如果是這樣,你需要使用某種類似的互斥機制或信號量的同步機制。

相關問題