2013-01-31 39 views
1

我想在C中使用主线程来打印结果,但当我创建线程时检查线程ID,当我打印结果其2不同标识。这里是我的代码: CX打印结果与Pthread(主)C

#include <pthread.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <stdbool.h> 
#include <time.h> 
#include <sys/time.h> 

void *Utskrift(void *simpleInt) 
{ 
    int simple; 

simple = (int)simpleInt; 
/*Printing my result and thread id*/ 
printf(";Hello From Thread ! I got fed with 
an int %d! AND it is THREAD ::%d\n",simple,pthread_self()); 

} 


main(){ 

pthread_t thread_id; 
int test=2; 
/*Using main thread to print test from method Utskrift*/ 
pthread_create (&thread_id, NULL,&Utskrift,(void *) test); 
/*Taking look at my thread id*/ 
printf(" (pthread id %d) has started\n", pthread_self()); 
pthread_join(thread_id,NULL); 


} 

我新的线程编程和C为好。所以我可能误解了pthread_create (&thread_id, NULL,&Utskrift,(void *) test);。它是否使用我的主线程调用方法Utskrift并打印结果,还是创建一个新线程“孩子”到我的主线程,然后孩子打印结果?如果是这样,你能请我解释一下如何使用主线程来打印我的“测试”。

输出:

(pthread id -1215916352) has started ;Hello From Thread ! I got fed with an int 2! AND it is THREAD ::-1215919248 
+0

您可以发布您的输出? – noMAD

+0

(pthread id -1215916352)已经开始 ; Hello From Thread!我吃了一个int 2!它是线程:: - 1215919248 –

+0

请在这里发布时请正确格式化您的代码。另外你的'(void *)测试'东西是残酷的。在你理解的状态下,你绝对不应该使用演员,而后来当你更坚定地使用演员时,尽可能少。如果你从某个地方复制了这样的东西,也许改变你的来源。 –

回答

0

pthread_create功能(spec)创建一个新的线程将执行(在这种情况下Utskrift)传递给它的功能。在pthread_create的最后一个参数中传递的值被传递给函数。

如果你只是想叫Utskrift功能在你的主线程,你可以做它的正常方式:

Utskrift((void *)test)); 

如果你想从你的完成线程的数据传递回另一个线程,你可以使用pthread_join这将返回由你的线程的启动程序返回的值,或线程传递给pthread_exit值:

#include <pthread.h> 
#include <stdio.h> 

void *checker(void *arg) { 
    int number = (int) arg; 

    if (0 == number) 
     return "number was zero"; 
    else 
     return "number was not zero"; 
} 

int main(void) { 
    int test = 0; 
    pthread_t thread_id; 
    char *s; 

    pthread_create (&thread_id, NULL, checker,(void *) test); 
    pthread_join(thread_id, &s); 
    printf("%s\n", s); 

    test = 1; 

    pthread_create (&thread_id, NULL, checker,(void *) test); 
    pthread_join(thread_id, &s); 
    printf("%s\n", s); 

    return 0; 
} 
+0

谢谢塞缪尔,这对我非常有帮助。我有我试过这个代码,甚至修改了一下。现在我了解了这些工作人员的实际情况。我的下一个问题是,如果有可能通过pthread_join传回数组?我无法修复它,只返回第一个元素,最后一个元素返回为“98232179”数字。我认为这是因为逆转* Myarray只返回第一个元素的值。你可以给一些例子,如何传递和pthread_join –

+0

@MaxMansour,不完全。数组在C语言中有点复杂。这似乎是一篇关于如何完成你想要的东西的好文章:http://www.eskimo.com/~scs/cclass/int/sx5.html –

+0

另外,如果这个答案解决你的问题,请选择“接受”复选标记,以便我可以获得积分,其他人会知道这个问题已被回答可以接受。 –

1

main()也是一个线程。所以当你创建一个线程时,你基本上从main()分叉,并在新线程中处理其他东西。 pthread_join()将等到您的新线程退出,然后继续主线程。希望这是有道理的。

0

这条线main

printf(" (pthread id %d) has started\n", pthread_self()); 

正在打印主线程的并行线程ID,而不是一个你以前创建的。你在线程中得到的ID应该与thread_id中存储的相同。你大概的意思是写:

printf(" (pthread id %d) has started\n", thread_id); 

旁注:pthread_t往往不仅仅是一个int更大。我建议打印出来是这样的:

printf("... %lu ...", ..., (unsigned long)thread_id, ...); 
+0

啊哈,所以我uderstod它的权利,如果我想打印somthing的主线程比我甚至不需要anotherer无效方法(如Utskrift)我可以简单地做主要的printf,因为主要还是一个线程? –

+0

@MaxMansour,是的,当你的程序启动时,它已经是一个线程。你可能需要更多的线程来并行计算某些东西,或者同时做不同的事情。的确,如果你想要做的只是'printf',你不需要另一个线程。我会再说一遍,如果你不想让事情并行运行,你不需要线程。 – Shahbaz