2009-11-10 149 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