2011-11-27 37 views
1

我是新來的線程和進程。c/C++加入進程?

我的代碼現在正常工作,將代碼分成多個進程。然而,每個進程都需要添加到全局變量中,但是從我閱讀的內容來看,每次進程分叉時,都需要全局副本,並獨立添加它們。有沒有辦法加入他們,就像你可以使用線程一樣?

+0

您必須深入瞭解進程間通信。 – AraK

+0

你真的應該爲此使用線程。 '叉* *應該*(意見的問題)被認爲是不贊成的,特別是因爲你只能在多線程程序的fork中執行異步信號安全函數,並且沒有可測試的方式來確定程序不是多線程的即使內部部分的實現可能是多線程的,而你不知道它)。 –

+0

@R .:正是因爲你提出的問題,符合POSIX標準的實現必須至少表現得好像實現的內部部分不是多線程的。 – caf

回答

2

不同的進程可以通過共享內存進行通信和交換數據。 在Linux上,你可以看看:

人shm_overview

對幾個進程的信號庫

人sem_overview 用於控制連接內存段並行訪問。

0

您應該定義一個帶有兩個字段的結構體,一個用於全局,另一個用於信號量。然後,在發生任何分支之前,在父進程中創建一些足夠大的共享內存來存放此結構,並在那裏初始化一個內存。在兒童中,映射共享內存,以便他們可以訪問全局。所有進程,父母和孩子,在進入全球時應遵守信號量的規則。

爲了避免不必要的阻塞而影響性能,請儘量不要讓信號量過長。閱讀全局時,在一個過程中快速複製並使用它,而不是在整個使用過程中保持信號量。同樣,當改變全局時,提前準備你的改變(在你獲得信號量之前),一旦你有了信號量,就一次性複製它們。有時你的工作取決於閱讀和寫作全球化,而不必在閱讀和書寫之間進行變化。在這種情況下,一些阻塞可能是不可避免的。

目前尚不清楚您使用的是哪種平臺,但所有主要的PC和服務器平臺(Windows,Linux/Unix/Mac OS)都支持共享內存和信號量。這些API可能不同,但您需要的功能就在那裏。