天天看點

c語言怎麼同時運作兩個線程,運作兩個C程式同時共享記憶體,怎麼樣?

在這一部分中,您将開發 将使用共享記憶體的過程生産者 - 消費者的應用通信(POSIX共享 記憶體,而不是System V共享記憶體)。将有N家生産商和N 消費者。 N可以是1,2或3.

您将開發一個生産者程式(producer.c)和一個消費者程式(consumer.c) 。當開始時,生産者程式将建立N個子過程,其将作為N個生産者(即,每個 子過程将是生産者過程)。

同樣,啟動時,消費者程式将建立N個子程序,其中每個子程序将充當消費者程序 。您會考慮根據N确定消費者為0,1,2, 。例如,如果N為2,那麼将有兩個消費者0和1.

消費者計劃将首先運作。運作時,消費者程式 将首先建立大小為4 KB的共享記憶體。這個共享記憶體 将是您将擁有共享單個緩沖區的地方。 生産者和消費者可以通路緩沖區。緩沖區 大小為100.它最多可容納100個項目(整數)。在共享的 記憶體中,您可以有一些其他共享變量,您覺得它們是必需的。消費者計劃還将建立一個或多個信号量(您決定多少個信号量)。

然後它将使用fork() 系統調用(您不需要使用exec()系統調用)建立N個子程序(N個消費者)。消費者程式(父級)的主程序在建立子程序後不應終止。它應該等到所有 兒童(即消費者)完成他們的任務并終止。當所有 孩子終止時,它将從系統的 中删除(删除)共享記憶體。它也将删除(删除)信号量。然後它可以終止以及 。

每個生産者将讀取的正整數的一個輸入檔案(每行一個 整數),将隻是通過共享 緩沖器坐在在共享存儲器(由消費者程式建立)通過整數的生産者和消費者之間 。

每個消費者将從共享緩沖區讀取整數,并且将 接收到的整數z寫入到與消費者相關聯的輸出檔案中,如果zN modN等于消費者的ID。例如,如果N是3并且 如果消費者的ID是2并且消費者已經收到了 整數7,則它将不執行任何操作(忽略),但是如果它接收到8, 它将把整數寫入其輸出檔案。輸出檔案 在一行中包含一個整數。雖然生産者和消費者通路共享緩沖區的位址是 ,但他們應該使用信号量,以便 通路得到同步。此外,如果緩沖區已滿,生産商 應該睡覺,如果沒有東西要消費,消費者應該睡覺。我們不應該等待。您将使用POSIX信号量 (稱為信号量)。消費者程式将被調用如下:

消費者N ...

這裡,N是要建立的消費者程序的數量。該參數的值 必須與生産者程式的相應參數 相同。在這裡,輸出檔案的名稱是 ,消費者将使用ID為X的編号。輸入的輸出檔案名的編号為 将等于N.是我們用 可以識别共享記憶體的名稱。是我們可用于識别信号量的名稱(它可以是可用于許多信号量的名稱的 的字首) 。當 調用生産者時,必須使用這些相同的名稱。生産者程式将被命名為 制片人,并具有下列參數調用:

生産ň...

這裡,N是生産者的數量。這是生産者X的 輸入檔案的名稱。輸入檔案是存儲 整數的文本檔案。我們輸入的輸入檔案名稱的數量将等于N. 檔案中可以有一個或多個整數。一個輸入檔案可以是相當大(數十億整數)的 。是我們可以用來識别共享記憶體的名稱。是我們可以用來識别信号量的名稱。

程式的示例調用可以如下所示。

消費3 out0.txt out1.txt out2.txt mysmem mysemaphores生産3 in0.txt in1.txt in2.txt mysmem mysemaphore