2011-11-08 84 views
0

好,這裏是一段代碼,我發現很奇怪:的整數遞增

printf("di consumerthread : mulai isi data, itmsg = %d\n",itmsg);        
msgq->data[itmsg]=rec_data; 
printf("di consumerthread : selesai isi data, itmsg = %d\n",itmsg); 

我發現奇怪的是輸出:

di consumerthread : mulai isi data, itmsg = 42 
di consumerthread : selesai isi data, itmsg = 98 

怎麼來的itmsg變量此行後突然從42變爲98

msgq->data[itmsg]=rec_data; 

可有人請告訴我如何解決這個問題,這個奇怪的輸出的原因是什麼?

+1

'rec_data'可能是'msgq-> data [itmsg]'的引用,所以賦給'msgq-> data [itmsg]'會改變'itmsg'的值。這不太可能。 –

+0

真的需要在這裏提供更多的上下文,也就是rec_data是什麼,等等。好像你可能正在寫數據數組之外並覆蓋它本身。 –

+1

您的調試輸出似乎表明線程正在發生。 'itmsg'在不同的線程中被改變了嗎? –

回答

-1

好吧,我終於發現了什麼問題

對不起,如果我不給你足夠的信息,因爲我的頭是一個爛攤子給詳細解釋一下..

所以,我做了什麼來解決它: 改變所有類型的全局變量,包括itmsg,對靜態 和所有使用全局變量類型程序和功能,以靜態

,它解決了所有我的問題!

但我仍然不知道什麼是靜態函數..

感謝您的幫忙! :D

+3

這聽起來像是你發現了一些似乎可以解決問題的東西,但是你是否明白問題所在?並且*爲什麼*你所做的修復了它? – Caleb

+1

你可能沒有解決這個問題。我們稍後會看到你... –

4

也許msgq-> data [itmsg]是itmsg的別名。它可能發生。如果你繼承這個代碼,就在其上運行一個邊界檢查器。

+0

+1優秀的思想 - 甚至沒有發生在我身上。 – Caleb

-1

你有兩個或更多的線程都使用itmsg變量?代碼片段中沒有任何內容會改變該變量的值,因此看起來它必須是另一個正在改變它的線程。

如果您使用線程,則需要保護它們與互斥鎖共享的任何數據。

0

如果不能僅基於問題中的信息知道問題,則問題可能是多個線程同時訪問同一個內存位置(msgq->data[itmsg]),而沒有任何形式的正確同步。

4

數據數組的大小是多少?你是否忘記了它的界限?

itmsg可能會被rec_data分配到msgq-> data [itmsg]而被覆蓋。如果他們宣佈彼此接近,這是非常可能的。