我需要設計一個系統,其中有兩個線程T1和T2,其中T1提交結果,T2讀取結果。如何共享和訪問兩個線程之間的鏈接列表
什麼是定義可用於設計此類系統的數據結構的最有效方法?沒有可以在線程間訪問的共享內存,並且在複製結果的情況下會限制memcpy的使用。
結果結構被定義爲預先
typedef struct
{
UINT32 ot_id;
BOOLEAN result;
} RESULT;
感謝。
我需要設計一個系統,其中有兩個線程T1和T2,其中T1提交結果,T2讀取結果。如何共享和訪問兩個線程之間的鏈接列表
什麼是定義可用於設計此類系統的數據結構的最有效方法?沒有可以在線程間訪問的共享內存,並且在複製結果的情況下會限制memcpy的使用。
結果結構被定義爲預先
typedef struct
{
UINT32 ot_id;
BOOLEAN result;
} RESULT;
感謝。
(這個答案是有效的,只要你是一個UNIX /類Unix系統!)
雖然定義線程的存在意味着共享內存,你可以去怪人方式改用管道。
函數pipe()
在<unistd.h>
中聲明。它需要一個int[2]
作爲參數,並返回錯誤代碼int
(0
成功,否則失敗)。如果成功,該函數會創建兩個新的文件描述符,一個用於讀取,另一個用於寫入。無論何時寫入只寫文件描述符,該數據都會到達只讀文件描述符!該機制被稱爲管道。如果嘗試讀取只讀文件描述符,但數據仍然不存在,那麼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;
}
謝謝凱米。這很有幫助。我嘗試將結果排入線程1的全局分配鏈表中,但是當我嘗試從線程2中取消結果時,我正面臨分段錯誤。 – user3555115
@ user3555115:嗨!你可以在[PasteBin](http://www.pastebin.com/)上發佈你的全部源代碼或者類似的東西來分析你的代碼嗎?有很多事情可能是錯誤的。 – 3442
> 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.
(便攜式)C定義沒有辦法做到這一點。你在Windows,GNU/Linux或Unix,還是更奇特的東西? – 3442
你的問題有點困惑。數據結構設計和線程之間共享數據的機制是正交的。而你的意思是「沒有可以在線程之間訪問的共享內存」?根據定義,內存在同一進程的所有線程之間共享。 – kaylum
@kaylum:我認爲*他的意思是他的*任務*不允許他爲他的目的利用共享內存。 – 3442