2014-01-10 52 views
0

我有兩個線程。 一個是創建struct和填充數據它:在不同線程的struct中修改變量

int main(int argc, char *argv[]) { 
struct arg_struct args; 
args.remoteSockfd = remoteSockfd; 
/*...*/ 
args.active = 1; 

然後我將其添加到陣列:

while(activeSockets[index].active!=0){ 
       index++; 
      } 
activeSockets[index] = args; 

和創建新線程:

(void) pthread_create(&serverThread, NULL, threadBody, &args); 
} 

在第二線程我有:

void *threadBody(void *args) { 
/*...*/ 
arg_struct *foo = (arg_struct*) (args); 
} 

所以,現在我可以在結構上訪問變量:

sockfd = foo->remoteSockfd; 

但是當我嘗試對它們進行修改:

foo->active=0; 

它不會在第一線變化的變量。我怎樣才能修改第一個線程從另一個線程結構?

+2

這是需要你的代碼的整個部分,而不僅僅是一些部分。 – zoska

+0

如果在其他地方沒有錯誤......你是否試圖簡單地將'active'聲明爲'volatile'? –

+0

我認爲你需要閱讀多線程的教科書,特別是鎖定和跨線程內存一致性。 (如果你對https://www.kernel.org/doc/Documentation/memory-barriers.txt的反應是「是的,是的,我知道這一切」,請忽略此評論。) – zwol

回答

0

我懷疑你的問題是在這裏:

activeSockets[index] = args; 

這是複製在結構中的數據,而不是一個指針。如果在另一個線程中修改參數,那麼activeSockets中的數據將不會被更改。您需要使activeSockets成爲指針數組,而不是結構體,或者將activeSockets [i]傳遞給另一個線程。

無論如何,這是我的猜測。

+0

謝謝,但我該怎麼做?我編輯了代碼: 'arg_struct * activeSockets [25]; activeSockets [index] = &args;' 但現在我有分段錯誤(它只能在第一次運行)。 – user2275785

+0

您必須爲結構分配空間。否則,你只是用不同的指針再次使用相同的結構。嘗試另一種方式:將指針傳遞給數組元素而不是參數。 –