2012-01-27 102 views
0

的局部結構這是我的結構:如何將結構複製到一個線程

struct example { 
    int c=0; 
    char buf[10]; 
} 

我有這種類型在main()

... 
struct example *ex=malloc(sizeof(*ex)); 
... 

分配並傳遞給線程的結構

... 
pthread_create(&id[i], NULL, t_func, ex); 
... 

pthread_create被調用到main的子項中。

t_func是:

void *t_func(void* args) { 
    struct example *extmp = args; 
    .... 

如何創建在每一個線程本地struct example,並複製到它的結構和args的值是多少?我需要它,如果我修改本地結構的一個字段,這將不會在其他線程中看到。我見過的其他類似的問題,但我還沒有找到我的答案...

+0

難道你不能只爲每個線程malloc另一個線程並傳入*指針,就像你現在正在做的一樣?你真的需要複製它嗎? – 2012-01-27 20:54:29

+0

@MartinJames是的,我需要複製,因爲我需要每個線程的鏡面結構 – rschirin 2012-01-27 23:36:52

+0

@MartinJames你能解釋一下你是什麼意思嗎?你不能只爲每個線程malloc另一個線程並傳入*指針嗎?也許在僞代碼中,謝謝 – rschirin 2012-01-28 00:57:19

回答

2

在C語言中你可以分配結構類型的對象:

struct example *extmp = args; 
struct example local_copy = *extmp; 
+0

呵呵。我不確定我「不知道這個」和「從來沒有想過這樣做」。 – 2012-01-27 20:10:03

+0

+1,但你正在混合分配和初始化。 – 2012-01-27 21:46:41

+0

@ouah它不起作用。如果我修改local_copy的一個字段,將會修改* extmp的同一個字段。這是荒謬的,爲什麼我不能這樣做? – rschirin 2012-01-27 23:35:58

1

如果你想爲每一個乾淨的,不共享副本線程,複製的地方是在將它傳遞給線程之前。這可以避免需要鎖定數據的問題。

在你的情況下,main函數應該malloc另一個結構,那麼你可以使用memcpy*new_data = *old_data複製數據。然後你將指針傳遞給線程。

現在,這是重要的組成部分。主線程不應該再次觸摸那個副本。使用數據完成時,該線程應該調用free

是的,這意味着你仍然有一個指向一個結構,而不是線程堆棧上的結構。但是,想一想:堆棧上的結構會給你帶來什麼?你必須輸入->而不是.,就是這樣。

當然,我的建議得到了很多更加複雜和發展例外,如果你正在做的內存分配與無鎖的每個線程池或NUMA curlicues。在這些情況下,您可能確實希望在線程中創建副本。主數據需要被鎖定,線程需要複製數據,然後解鎖數據源。

在一些令人興奮的情況下,您可能需要三個副本:主副本(主內存),臨時副本(主內存但不需要鎖定主副本)和線程內副本(現在位於每線程內存中,也沒有鎖)。

+0

+1,但實際上不需要'memcpy'。用'='簡單拷貝'struct'會一直做。 – 2012-01-27 21:44:16

+0

事實上,pthread_create被調用到一個孩子可以改變什麼? – rschirin 2012-01-28 02:30:00

+0

@rschirin:不,但是如果主線程和新線程正在使用相同的數據,這是一個壞主意。最好製作副本並將所有權傳遞給線程。 – 2012-01-28 08:02:59

相關問題