C 为什么´;我的pthread函数是否打印出我所期望的内容?

C 为什么´;我的pthread函数是否打印出我所期望的内容?,c,pthreads,printf,C,Pthreads,Printf,我是线程编程新手,正在学习C语言中的线程编程 这段简单的代码可以编译并运行,但我认为它可以打印出“hello world”和数字8,但事实并非如此。有人知道原因吗 void *threadfunc(void *input_data){ printf("Hello World"); long tid; tid=(long)input_data; printf("thread ID: &d", tid); return NULL;

我是线程编程新手,正在学习C语言中的线程编程

这段简单的代码可以编译并运行,但我认为它可以打印出“hello world”和数字8,但事实并非如此。有人知道原因吗

void *threadfunc(void *input_data){  
    printf("Hello World");  
    long tid;  
    tid=(long)input_data;  
    printf("thread ID: &d", tid);  
    return NULL;  
    sleep(1);  
}  
int main(){  

    long t = 8;  
    int t1;  
    pthread_t thread_obj;  
    t1= pthread_create(&thread_obj, NULL,threadfunc, (void*)t);  
}*  

提前感谢!:)

首先,您可能希望在
pthread\u create
之后调用。如果不这样做,并且主线程退出,则新线程很有可能无法运行

换句话说,一旦一个线程退出,它们都会退出——进程不会“等待”其他线程



您可能还想在
printf
调用中添加换行符。

程序在
main
函数的末尾终止。在您的程序中,在调用
pthread\u create
之后就是哪个。因此线程没有机会运行


要让线程有机会运行,您需要让主函数等待线程完成。通过调用
pthread\u join

以及另一个所说的(给它一个在终止之前打印的机会),您使用了错误的格式说明符打印,基本上将变量传输到错误的线程。试一试

tid = *(long*)input_data;  
printf("thread ID: %ld\n", tid);

并使用
&t
而不是
(void*)t
调用线程函数。(
long
不会总是正确地转换为指针。)

您应该传递局部变量t的地址 t1=pthread_create(&thread_obj,NULL,threadfunc,(void*)&t)

你的线程函数应该是这样的

void *threadfunc(void *input_data){  
printf("Hello World");  
long tid;  
tid=*(long *)input_data;  
printf("thread ID: %ld", tid);  
sleep(1);  
}  

欢迎来到SO。请注意制定您的问题标题,以便更好地反映您所面临的问题。好的,我将在未来尽最大努力,这是我的第一个问题,因此我有点经验不足。有没有关于我应该如何表述它以使其更加正确和准确的建议?我想这只是你在为问题制作一个简短示例时的一个打字错误,但如果没有:
printf
格式标记为
%
,而不是
&
@Marit,你应该从一开始就减少它,它最终与线程无关。因此,请将其简化为最小的示例,例如,您可以首先直接调用您的
threadfunc
,查看它是否打印,等等。问题标题混合了两个很可能彼此无关的内容。谢谢!在打印格式说明符和添加pthread_join(&thread_obj,(void**)&t)以及线程打印“&ld”中进行了更改。以为会印“8”?祝你今天愉快@Marit看到我对为什么打印
&ld
的问题的评论。我已经运行了thread,将1)(void*)&t和2)&t作为要传递给函数的参数,它可以同时使用这两个选项。区别是什么?这两个选项都可以使用,因为在32位系统中,基本上是传递一个包含地址的指针,而指针基本上是4个字节,不管它指向什么。但一个好的做法是将其键入(void*)以避免警告。