2014-10-08 57 views
2

我正在学习C语言,但我的书提供的资源非常少。我想知道是否有可能,并且使用该线程来详细说明某些内容并将结果传递给main是有用的。在这种情况下,我想知道如何将信息从一个线程传递给main(类似于java中的方法return)。唯一的解决办法是使用全局变量? 这里有一个小例子来解释我想要做什么。这可能/有用吗?C - 主线程结果

主:

int i = 1; 
pthread_create(tid,NULL,functionTH,NULL); 
int z = //getResultFromThread 

线 “功能”:

void * functionTH(){ 
    int z = 2; 
    //return value 2 to the main and assign it to k in the main. 
} 

回答

3

看那pthread_create原型。

int pthread_create(pthread_t *restrict thread, 
     const pthread_attr_t *restrict attr, 
     void *(*start_routine)(void*), void *restrict arg); 

你的线程(start_routine)是一个返回void *功能。所以你的代码是错误的,因为你的线程函数什么都不返回正如你所猜测的,你通过返回一个指针返回一个值给你的主线程。

可以等待线程完成调用pthread_join读取此值。您从线程返回的值通过value_ptr参数传递。直到目标线程终止,除非目标线程 已经终止

的在pthread_join()函数应当暂停主叫 线程的执行。在从一个成功的在pthread_join()返回 调用与非NULL value_ptr参数,由终止线程传递到 了pthread_exit()的值应在 提供由value_ptr引用的位置。

当然,你不必使用这种机制。全局变量可以正常工作,但是您必须同步对变量的访问,否则最终会出现竞争条件。

+0

毫米,但value_ptr应该是在pthread_join和了pthread_exit空隙都,所以我怎么能传递一个INT throught呢? – testermaster 2014-10-08 18:26:13

+0

您可以投射'(void *)'例如'struct'的指针,它将包含您的'i'和'k'。 – soerium 2014-10-08 18:27:14

+0

那么,这样的事情应该工作?'void * functionTH(){pthread_exit((void *)22);}}}; (void *)&k); printf(“%d”,k);' – testermaster 2014-10-08 18:34:39

1

内存在线程之间共享,从而可以很容易地仅仅通过使用周围queues指针(使用每个线程一个队列)。另外,请记住使用mutex locks和其他concurrency control techniques

这里的另一个S.O后它展示了如何实现message passing between threads using queues

这篇文章题为“Queues, Mutexes, Semaphores..,”确实在解释你有比赛条件和关键部分,当你在C.

如果建立一个多线程的程序来考虑的告诫非常出色您对学习性能很感兴趣,Bartosz Milewski的文章“Beyond Locks and Messages: The Future of Concurrent Programming”在并发共享内存和消息传递方面表现出色,并且深入了解了事务性内存的优点以及传统锁的缺点。

如果您有任何问题,请让我知道!