2009-11-10 147 views
0

這可能是一個簡單的查詢。關於多線程程序的查詢

當我們創建一個線程時,我們將(void *)t作爲參數傳遞給一個函數PrintHello.we正在將指針threadid中的值複製到tid中,這是一個很長的變量我很迷惑參數傳遞。 這是一個通過引用或通過value.over所有這是正確的嗎? (value *)t。它通過了什麼值?

long t; 
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t); 

void *PrintHello(void *threadid) 
{ 
    long tid; 
    tid = (long)threadid; 

請幫我避免我的困惑:(

回答

5

你在做什麼是通過價值。只要sizeof(T) <= sizeof(void*)對於您試圖通過的T類型即可。

如果不是的話,你應該在堆上創建T,因爲它可能是超出範圍時所創建的線程試圖訪問它:

T* t = new T(someValue); 
rc = pthread_create(&threads[t], NULL, PrintHello, (void*)t); 
+0

這是正確的答案。在這種情況下,假設你只想傳遞32/64位標量變量,那麼它是安全的。該值僅被複制,無論函數是否終止,您都可以安全地讀取數據。 – minjang 2009-11-10 08:26:38

0

應當按引用傳遞。

確保參U傳遞要麼是全球性的,或者爲了動態地分配給線程函數訪問。

您ř傳遞編輯部地址所以寫此....

RC =在pthread_create(&線程[T],NUL L,PrintHello,(void *)& t);

+0

HTTPS://computing.llnl。 gov/tutorials/pthreads /顯示這個例子。 那麼這個例子不正確? – Vijay 2009-11-10 07:45:13

+0

該示例正常工作,因爲主線程不會在孩子之前停止 - 但這是一個假設,在更復雜的情況下可能不是這樣。 只是在任何情況下複製並粘貼它都是危險的... – weismat 2009-11-10 07:50:48

+0

該網頁還表示'rc = pthread_create(&threads [t],NULL,PrintHello,(void *)&t);'是一種不正確的傳遞方式但是爲什麼呢? – Vijay 2009-11-10 07:54:05