我正在關注 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包含,因爲這是本地主要?
有人可以確認/拒絕並修復我的理論嗎?
你需要向我們展示你在哪裏添加了'void * v'和當然在主要的 – pippin1289
啊中的follwing行。 v得到t的值。在'long t'之後,'t'有一個未定義的值。把它放在for循環裏面。 – pippin1289
謝謝pippin1289。我完全忽視了最常見的懷疑,並且懷疑是否這是由於在調用函數時投射 - 這當然是無效的懷疑。 將v =(void *)t移入循環之後,它按我期望的方式工作:) – user657862