2013-05-19 28 views
1

我需要在程序中創建多個FIFO隊列,用於同一進程中線程之間的通信。指向pipe的指針,是否存在嚴格的別名或雙關語類型問題?

我想我可以用管道()用於此目的,因爲這樣,我可以使用select或poll從隊列中獲取節點的線程上。

 int* fd_pipe = (int*)malloc(2*sizeof(int)); 
     pipe(fd_pipe); 

現在的問題是如何把指針到隊列 因爲每個節點是strucutre,我希望把指針到隊列中,像

的typedef { 結構包* PKT; struct Info * info; int seq; }節點;

on threads which put node into the queue: 

    Node* node = (Node*)malloc(sizeof(Node)); 
    Node->info = ...; 
    Node->seq = ...; 
    Node->pkt = ...; 
    write(fd_pipe[1], node, sizeof(node)); 

    on threads which read node from the queue: 

    char buf[1000]; 
    read(fd_pipe[0], buf, sizeof(node)) 
    Node* mynode = (Node*)buf; 

然後mynode是我想要的。

有什麼錯在我的計劃? 特別嚴格的別名或雙關問題? 謝謝!

+0

你不需要投在C程序malloc'的'的返回值。 –

+0

我更新了我的代碼,你的意思是轉換'Node * node =(Node *)malloc(sizeof(Node));'是不是必須的?我的源代碼中是否還有其他問題? – misteryes

+0

'char buf [1000];'是絕對錯誤的。這不是鋸齒違規,而是違反對齊。相反,你應該使用'節點buf;' –

回答

2

你沒有走樣的問題。這裏我看到的唯一問題是read(fd_pipe[0], buf, sizeof(node)),這應該是read(fd_pipe[0], buf, sizeof(Node *))

我不知道你爲什麼在這裏使用一個字符緩衝區,我更喜歡

Node *node; 
if (read(fd_pipe[0], &node, sizeof(node)) <= 0) { 
    // error, deal with it 
} 

它的簡單和清晰。

現在,您的代碼將只工作,如果你使用阻塞I/O這是默認的。另外,從技術上講,如果讀/寫大小小於PIPE_BUF(它總是比指針大得多),則應該處理短讀/寫,但在管道上寫/讀是原子的。

您有一點在編寫代碼之前關於內存同步的灰色區域,但由於這是一個系統調用,它將起作用。

管道是線程之間進行通信的不同尋常的方式。通常,人們使用內存隊列來在線程之間進行通信。一個例子是http://www.boost.org/doc/libs/1_53_0/doc/html/boost/lockfree/queue.html

+0

我使用'C'而不是'C++',我想使用select/poll來頻繁輪詢隊列,內存隊列似乎不適用於這種情況? – misteryes

+0

我不明白你提到的灰色地帶,它在哪裏? – misteryes

+0

我需要在fd_pipe [0]上使用select/poll,爲什麼阻塞I/O是必要的?什麼是簡短的讀/寫。並從這個鏈接http://stackoverflow.com/questions/1712616/multithreading-read-from-write-to-a-pipe,在我看來'讀/寫'是不是原子,應該使用互斥鎖? – misteryes

相關問題