2009-11-10 2 views
0

간단한 쿼리 일 수 있습니다.멀티 스레딩 프로그램에 대한 쿼리

우리가 스레드를 만들 때 (void *) t를 함수의 인자로 전달할 때 PrintHello.we는 긴 변수 인 tid에서 포인터 threadid (long에 typacasting)의 값을 다시 복사합니다. .i 매개 변수 전달과 혼동합니다. 이것은 참조로 전달하거나 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

당신이하고있는 일은 가치 전달입니다. 전달하고자하는 유형이 T 인 경우 sizeof(T) <= sizeof(void*) 일때는 문제가 없습니다.

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

정답입니다. 이 경우에는 32/64-bit 스칼라 변수 만 전달한다고 가정하면 안전합니다. 값이 복사되고 함수의 종료 여부와 상관없이 안전하게 읽을 수 있습니다. – minjang

0

그것은해야 참조로 전달합니다.

하는 u는 전역 또는 동적 스레드 기능에 액세스하기 위해 할당해야 중 하나를 통과해야합니다 매개 변수를 확인 할 수 넌 addresss 그래서이 물품 r에 전달.

....

= RC는 pthread_create (& 스레드 [t], NUL L, PrintHello, (void *) & t);

+0

은 https : //computing.llnl를 그런 경우가 아닌 경우

, 당신은 생성 된 스레드가 액세스하려고 할 때이 범위를 벗어날 수 있습니다으로 힙에 T을 만들 수 있습니다. gov/tutorials/pthreads /이 예제를 보여줍니다. 이 예가 잘못 되었습니까? – Vijay

+0

예제는 주 스레드가 하위 스레드보다 먼저 멈추지 않기 때문에 올바르게 작동하지만, 이는 좀 더 복잡한 시나리오에서는 그렇지 않을 수도 있습니다. 어떤 상황에서도 복사하여 붙여 넣기 만하면 위험 할 수 있습니다 ... – weismat

+0

웹 페이지에서는'rc = pthread_create (& threads [t], NULL, PrintHello, (void *) &t);' 인수가 아니라 왜? – Vijay