2015-11-06 61 views
0

我需要設計一個系統,其中有兩個線程T1和T2,其中T1提交結果,T2讀取結果。如何共享和訪問兩個線程之間的鏈接列表

什麼是定義可用於設計此類系統的數據結構的最有效方法?沒有可以在線程間訪問的共享內存,並且在複製結果的情況下會限制memcpy的使用。

結果結構被定義爲預先

typedef struct 
{ 
    UINT32 ot_id; 
    BOOLEAN result; 

} RESULT; 

感謝。

+0

(便攜式)C定義沒有辦法做到這一點。你在Windows,GNU/Linux或Unix,還是更奇特的東西? – 3442

+1

你的問題有點困惑。數據結構設計和線程之間共享數據的機制是正交的。而你的意思是「沒有可以在線程之間訪問的共享內存」?根據定義,內存在同一進程的所有線程之間共享。 – kaylum

+0

@kaylum:我認爲*他的意思是他的*任務*不允許他爲他的目的利用共享內存。 – 3442

回答

1

這個答案是有效的,只要你是一個UNIX /類Unix系統!

雖然定義線程的存在意味着共享內存,你可以去怪人方式改用管道。

函數pipe()<unistd.h>中聲明。它需要一個int[2]作爲參數,並返回錯誤代碼int0成功,否則失敗)。如果成功,該函數會創建兩個新的文件描述符,一個用於讀取,另一個用於寫入。無論何時寫入只寫文件描述符,該數據都會到達只讀文件描述符!該機制被稱爲管道。如果嘗試讀取只讀文件描述符,但數據仍然不存在,那麼read()函數將會簡單地阻塞(除非通過fcntl()指示以其他方式執行)。

對於任何int fd[2],pipe(fd)fd[0]設置爲讀取結束並將fd[1]設置爲寫入結束。

現在,您可以在產生第二個線程之前調用pipe,並將fd[0]作爲參數傳遞給它,以便它可以讀取數據!讓我們來看一個例子(注意,沒有錯誤檢查!)...

#include <unistd.h> 

typedef struct { 
    UINT32 ot_id; 
    BOOLEAN result; 
} RESULT; 

void secondThread(int readDescriptor) { 
    RESULT result; 
    read(readDescriptor, &result, sizeof(RESULT)); 

    // Do something with that... 

    close(readDescriptor); 
} 

int main() { 
    int fd[2]; 
    pipe(fd); 

    spawnTheSecondHolyThread(secondThread, fd[0]); 

    RESULT result; 

    // Calculate the result... 

    write(fd[1], &result, sizeof(result)); 
    close(fd[1]); 

    joinTheSecondThread(); 
    return 0; 
} 
+0

謝謝凱米。這很有幫助。我嘗試將結果排入線程1的全局分配鏈表中,但是當我嘗試從線程2中取消結果時,我正面臨分段錯誤。 – user3555115

+0

@ user3555115:嗨!你可以在[PasteBin](http://www.pastebin.com/)上發佈你的全部源代碼或者類似的東西來分析你的代碼嗎?有很多事情可能是錯誤的。 – 3442

0
> Use queue. 
> 1. create the queue and call the method that will produce(submit) data to the queue. 
> 2. create a new thread that will read the data from the queue. 
> 3. use mutex or any else mechanism to protect the queue heads. Else you can go lock free queue implementation. 
> 
> Let me know if you need any code. 
相關問題