簡體   English   中英

使用信號量的for循環在進程之間進行同步

[英]Synchronization between processes with for loops using semaphores

內容:

  • 我試圖讓兩個進程寫入共享內存空間中的同一數組。

  • 每個進程將使用for循環寫入數組的一半。

  • 數組的第一個元素將始終存儲要寫入的下一個元素的索引。

  • IPC通過共享內存中的信號量完成。

前提條件:

  1. 數組和信號量均已在共享內存中正確設置。
  2. 如果我在for循環之外等待sem_wait和sem_post,程序運行正常,這意味着使整個過程原子化。 (這也是我認為信號量和數組已正確設置的原因)

問題

但是,當我嘗試通過將sem_wait和sem_post放入for循環來減小關鍵區域時。 由於數組的某些部分未寫入,因此無法同步。 但是這兩個進程完成了它們的循環,其中循環總數應等於數組長度。

非常感謝建議為什么會發生這種情況???


更新

在OS X上,sem_init()無法正常工作。 使用sem_open()解決此問題。 參考: http : //lists.apple.com/archives/darwin-dev//2008/Oct/msg00044.html

在針對問題情況的偽代碼中,父線程在自己釋放后就需要信號量。 現在,由於信號燈可用,因此父級將繼續執行。 當其時間片到期時,內核可能會切換到子進程,但它正在等待信號量。 信號量是通過父進程獲取的。 因此,父級將繼續執行。

在這種情況下,父執行兩次,子執行不。

這可能導致不同步執行。

查看您的實際代碼,我認為問題在於您如何創建信號量。 如果您在sem_init上閱讀了手冊頁:

如果pshared為非零,則信號量在進程之間共享, 並且應位於共享內存的區域中 (請參見shm_open(3),mmap(2)和shmget(2))。 (由於fork(2)創建的子級繼承了其父級的內存映射,因此它也可以訪問該信號量。)任何可以訪問共享內存區域的進程都可以使用sem_post(3),sem_wait(3)和該信號量進行操作。以此類推。

這里的關鍵是粗體文本-您的信號量不在共享內存中,因此在兩個進程之間並未真正共享,因此您正在看到爭用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM