C 以基本方式使用线程分割错误
我正在使用pthreads编写一个非常简单的程序,但我一直遇到一个“分段错误”,我不明白为什么。该程序将用C语言编译 程序应该创建3个线程,每个线程都应该打印其编号和调用线程编号(在本例中,我只希望3个线程说“我是线程(i),调用线程是0”,因为它们都是从同一个线程创建的) 我认为,问题在于用于分配要传递的内存的malloc函数 如果这是te问题,我如何解决它 我是否应该在“for”循环之前创建一个由3个指针组成的数组,并在该数组的每个指针中存储要传递给线程的两个变量?如何真正做到这一点?我试过了,但似乎不起作用C 以基本方式使用线程分割错误,c,multithreading,pointers,segmentation-fault,malloc,C,Multithreading,Pointers,Segmentation Fault,Malloc,我正在使用pthreads编写一个非常简单的程序,但我一直遇到一个“分段错误”,我不明白为什么。该程序将用C语言编译 程序应该创建3个线程,每个线程都应该打印其编号和调用线程编号(在本例中,我只希望3个线程说“我是线程(i),调用线程是0”,因为它们都是从同一个线程创建的) 我认为,问题在于用于分配要传递的内存的malloc函数 如果这是te问题,我如何解决它 我是否应该在“for”循环之前创建一个由3个指针组成的数组,并在该数组的每个指针中存储要传递给线程的两个变量?如何真正做到这一点?我试过
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
void *Son (void* arg)
{int *id=(int*)arg; //retrieve array
sleep(id[1]+1);
printf("I'm thread %d , created from %d! \n",id[1],id[0]);
free(arg);
pthread_exit(0);
}
int main()
{pthread_t threads[3];
int i;
for (i=0;i<3;i++)
{int *a= malloc(2*sizeof(int)); // dynamically allocate a variable which will be freed in the thread once executed
a[0]=0; //store i in the content of dynamically allocated a
a[1]=i;
pthread_create(&threads[i],NULL,Son ,(void*)a);
}
int j;
for (j=0;j<3;i++)
{pthread_join(threads[i],NULL);
printf("Joined thread %d",j);
}
printf("THREAD FINISHED\n");
return 0;
}
#包括
#包括
#包括
#包括
void*Son(void*arg)
{int*id=(int*)arg;//检索数组
睡眠(id[1]+1);
printf(“我是线程%d,从%d!\n创建,id[1],id[0]);
自由(arg);
pthread_退出(0);
}
int main()
{pthread_t threads[3];
int i;
对于(i=0;i此处:
用于(j=0;j此处:
for(j=0;j请不要在C中向/从void*
强制转换(类似,但也一般)还有,缩进可以改进。遗憾的是,对于儿子的孙子来说,实际的程序只是儿子,但仍然没有work@unwind当试图在模拟某种继承的同时链接不同类型的列表元素时,从void*
强制转换可能会有所帮助,不是吗?@Eregrith什么?这不是关于“链接”或“列出元素”,我不明白你的意思。确实有些地方需要强制转换,但它们非常罕见。这段代码不需要强制转换,但仍然有它们。@unwind“请不要在C中的void*中强制转换到/从void*中转换(如malloc()的返回值), 但一般来说)“这与“确定有需要施放的地方”不符。这是我的观点。请不要在C中施放到/从void*
(类似,但也一般)还有,缩进可以改进。遗憾的是,对于儿子的孙子来说,实际的程序只是儿子,但仍然没有work@unwind当试图在模拟某种继承的同时链接不同类型的列表元素时,从void*
强制转换可能会有所帮助,不是吗?@Eregrith什么?这不是关于“链接”或“列出元素”,我不明白你的意思。确实有些地方需要强制转换,但它们非常罕见。这段代码不需要强制转换,但仍然有它们。@unwind“请不要在C中的void*中强制转换到/从void*中转换(如malloc()的返回值), 但通常情况下)“这与“确定有需要进行强制转换的地方”不符。这是我的观点。这里学到的教训不是应该像这样编写循环:for(int i=0;i!=limit;++i)
?在循环外部创建循环变量是导致此错误的首要原因。一般规则是尽可能减少变量的范围。@UlrichEckhardt,或者干脆坚持使用i
,而不是使用多个计数器变量。我不建议这样做,@CoolGuy。它与应用程序一样有效遵循保持变量范围小的一般规则,但将此一般规则变成一种习惯,也是主动预防未来此类错误(以及其他类似错误)的方法。这里学到的教训不应该是,您应该这样编写循环:for(int i=0;i!=limit;++i)
?在循环外部创建循环变量是导致此错误的首要原因。一般规则是尽可能减少变量的范围。@UlrichEckhardt,或者干脆坚持使用i
,而不是使用多个计数器变量。我不建议这样做,@CoolGuy。它与应用程序一样有效遵循保持变量范围小的一般规则,但将此一般规则转变为习惯,也是在将来主动预防此类错误(以及其他类似错误)的方法。
for (j=0;j<3;i++)
{
pthread_join(threads[i],NULL);
printf("Joined thread %d",j);
}