2013-01-16 34 views
1

如果我需要同時調用兩個線程,這兩個線程都使用特定套接字上的send()函數調用函數,那麼對send()函數中的關鍵部分進行變形或使用互斥體進行調查會更有用嗎? (因爲套接字是內核對象)線程同步 - 臨界區或互斥鎖?

+0

在某些操作系統上,send()調用本身已經是線程安全的。 – PlasmaHH

回答

1

我假設這是關於Windows(無法回想看到其他地方的關鍵部分)。

如果所有鎖定都在一個進程中,那麼確實使用哪個同步對象並不重要。如果你想跨進程邊界鎖定,那麼你應該使用互斥鎖,因爲臨界區只能在單進程內工作,但是可以在許多進程間共享名爲互斥鎖。

+3

實際上它很重要因爲互斥鎖是一個內核對象,並且需要更長的時間才能獲取它,當臨界區落入內核模式時僅等待它是否已被鎖定。否則(通常大多數情況下),它非常快。很久以前,我看到了數字,例如〜20個CPU指令來鎖定一個免費的臨界區和〜1000個CPU指令來獲得一個免費的互斥量。 –

-2

我認爲,互斥鎖應該工作得更快。

+2

窗口上的關鍵部分應該比互斥鎖快。雖然他們有更多的限制。一個這樣的限制是關鍵部分只能在一個過程中使用。 – drescherjm

4

假設Windows平臺(這是我們在關鍵部分和互斥體之間進行選擇的地方)。

互斥鎖(CreateMutex)速度較慢:即使沒有爭用,鎖定和解鎖始終是系統調用。但是,send的成本可能足以使這種差異變得不明顯。

正如另一個答案指出的,互斥體可以在進程之間共享(如果命名/重新打開或繼承),並且關鍵部分是本地進程。