2011-06-23 55 views
7

我已經看過我能找到的唯一類似帖子,但它不是我正在尋找的。使用共享內存與叉()

基本上,我試圖運行Odd-Even Sort與分叉,所以孩子運行賠率和父母運行evens。這些都需要共享向量inputValues,以及布爾型排序。

下面的代碼是沒有我的任何失敗的嘗試在共享內存,並且只是使用叉子與搜索算法的基本框架:

while(!sorted) 
{ 
    pID = fork(); 
    sorted = true; 
    cout << "Sort set to TRUE." << endl; 

    if(pID == 0) 
    { 
     int num = 1; 
     cout << "Child swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
     exit(0); 
    } 
    else if(pID < 0) 
    { 
     cout << "Failed to fork." << endl; 
     exit(1); 
    } 
    else 
    { 
     wpid = waitpid(pID, &status, waitStatus); 
     int num = 0; 
     cout << "Parent swap run" << endl; 
     Swap((void *) num); 
     cout << "Status: " << ((sorted) ? "SORTED" : "UNSORTED") << endl; 
    } 
} 

我試過黑客進行這種共享的多種方式的內存,但無法找到真正解釋它如何工作,我需要什麼以及最好的方法。

所以,我的要求如下:

  • 的家長和孩子必須能夠共享和操縱全局矢量和布爾
  • 這必須能夠在一個循環中運行,如圖所示
  • 這必須與變量的工作中主要使用()和掉期()函數

如果您有什麼祕訣,我非常感謝他們。謝謝!

+0

查看'shm_open' POSIX API調用的手冊頁。您想要創建一個共享內存區域,並將這兩個進程所訪問的變量放在那裏。你也可以很容易地用'mmap'調用。確保你的訪問是線程安全的......使用共享內存沒有固有的鎖定,所以你必須小心。 – Borealid

+0

請記住'shm_open',您需要調用'ftruncate'來爲共享內存對象分配空間,因此內存對象中的空間不會像您使用'std :: VECTOR'。如果您需要更多空間,則必須在運行時手動管理共享內存對象的大小。 – Jason

+0

這很明顯不是C代碼。 – Puppy

回答

4

您將不得不使用shmget()shmat()來設置共享內存對象,但不幸的是,這不會是一個動態內存對象,如std::vector。換句話說,您必須在共享內存對象初始化時聲明對象的整個大小。該過程雖然非常簡單,但在父項中,您將使用IPC_CREAT標誌調用shmget()來創建共享內存對象並獲取對象的ID值。然後用ID值調用shmat()以獲得指向該對象的指針。接下來,使用默認值初始化對象。當您分叉到您的子進程時,從shmat()返回的指針在子進程中仍然有效,因此您可以使用相同的指針變量在父進程和子進程中共享內存。

您還需要在父進程宣告你叉任何兒童使用sem_init()信號燈與pshared屬性設置爲0更大的值之前。然後父進程和子進程都可以使用信號量來控制對共享內存對象的訪問。

同樣,請記住,共享內存對象不是一個動態對象,因此在初始化它時需要爲它分配足夠的空間。