2010-04-03 53 views
4
子進程的數據共享

我的問題是有點概念,如何與由fork()電話或通過pthread_create()並行線程和用C

例如創建一個線程創建子進程共享父進程的數據,直接的全局變量傳遞給子進程,如果是的話,對父進程中的子進程效果值所做的該變量進行修改?

我欣賞的部分和完整的答案提前,如果我錯過任何現有的資源,我很抱歉,我已經做了谷歌一些搜索,但未能再次找到了良好的效果

謝謝您時間和答案

回答

5

fork()和pthread_create()的語義有些不同。

fork()將創建一個新的進程,其中全局變量將在父進程和子進程之間分開。大多數操作系統實現都將使用寫時複製語義,這意味着父進程和子進程都將爲所有全局變量使用相同的物理內存頁面,直到其中一個進程嘗試編輯物理內存爲止,頁面,所以現在每個進程都有自己的副本,並且沒有看到其他進程,所以進程是孤立的。

pthread_create()另一方面,在同一個進程中創建一個新線程。新線程將與同一進程的其他正在運行的線程有單獨的堆棧空間,但全局變量和堆空間在同一進程的所有線程之間共享。這就是爲什麼你經常需要一個互斥體來協調對同一進程的多個線程之間的共享內存段的訪問。

TL; DR版本:用fork(),你看不到其他人的變化;用你做的pthread_create()。

2

fork創建調用進程的幾乎精確副本,包括內存和文件描述符。全局變量與其他所有內容一起被複制,但它們不以任何方式鏈接到父進程。由於文件描述符也被複制,所以父和子可以通過這些進行交互(只要它們設置正確,通常通過管道或套接字對)。

+0

如何處理這種情況,我有一個int *在父進程中,當分叉時,它指向地址5的某個地方,子副本會指向同一個地方嗎?修改也會在父進程中生效 – besamelsosu 2010-04-03 10:03:27

+0

否。複製整個內存映像。無論它是一個變量還是一些未公開的內存片段都無關緊要。 – 2010-04-03 10:06:03

1

fork創建的流程與pthread_create創建的流程之間存在很大差異。進程不共享全局變量,並且應該通過管道,套接字或OS提供的其他工具進行通信。 MPI是一個很好的解決方案,它是一個用於進程間通信的消息傳遞庫。

線程是完全不同的。使用pthread_create創建的線程與其調用者共享所有全局變量。而且,調用者可以將任意結構傳遞給線程,並且該結構也將被共享。這意味着在使用線程進行編程時應該非常小心 - 這種共享數量很危險並且容易出錯。 pthread API爲線程之間的健壯同步提供了互斥體和條件(雖然它仍然需要實踐和專業知識才能正確實現)。