2013-10-13 85 views
-1

我正在關注 https://computing.llnl.gov/tutorials/pthreads的多線程教程,並嘗試了一些提供的代碼。代碼行爲的說明

我使用此源文件https://computing.llnl.gov/tutorials/pthreads/samples/hello.c 然後將此添加到主要功能:

void * v; 
    v = (void *)t; 

和更換這一行:

rc = pthread_create(threads+t, NULL, PrintHello, (void*)t); 

通過這樣的:

rc = pthread_create(threads+t, NULL, PrintHello, v) 

按理說(我知道這不是一個好主意:)),輸出應該保持不變.. 但是這是新的輸出:

In main: creating thread 0 
In main: creating thread 1 
Hello World! It's me, thread #140734232544832! 
In main: creating thread 2 
In main: creating thread 3 
Hello World! It's me, thread #140734232544832! 
In main: creating thread 4 
Hello World! It's me, thread #140734232544832! 
Hello World! It's me, thread #140734232544832! 
Hello World! It's me, thread #140734232544832! 

線程#是垃圾!

有人可以向我解釋這裏發生了什麼?爲什麼輸出改變了?

是因爲t被值傳遞並被傳遞給PrintHello而現在,在我試圖傳遞指針並且該指針的地址正確傳遞的同時 - 該地址不包含值t包含,因爲這是本地主要?

有人可以確認/拒絕並修復我的理論嗎?

+1

你需要向我們展示你在哪裏添加了'void * v'和當然在主要的 – pippin1289

+1

啊中的follwing行。 v得到t的值。在'long t'之後,'t'有一個未定義的值。把它放在for循環裏面。 – pippin1289

+0

謝謝pippin1289。我完全忽視了最常見的懷疑,並且懷疑是否這是由於在調用函數時投射 - 這當然是無效的懷疑。 將v =(void *)t移入循環之後,它按我期望的方式工作:) – user657862

回答

1

您的意見後,你需要從改變你的代碼:

long t; 
void* v; 
v = (void *)t; 
for(...) 
    //stuff 

到:

long t; 
for(...) { 
    void* v; 
    v = (void*) t; 
    //stuff 
} 

基本上就是在現有的情況下發生的是,t是未初始化的,因此它的價值是不確定的。然後它被複制到變量v中並傳遞給pthread。如果它在for循環中,那麼t已經被初始化。

+0

是的。得到它了。我回答了你上面的評論。非常感謝! – user657862