C 为什么´;我的pthread函数是否打印出我所期望的内容?
我是线程编程新手,正在学习C语言中的线程编程 这段简单的代码可以编译并运行,但我认为它可以打印出“hello world”和数字8,但事实并非如此。有人知道原因吗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;
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*)以避免警告。