Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以基本方式使用线程分割错误_C_Multithreading_Pointers_Segmentation Fault_Malloc - Fatal编程技术网

C 以基本方式使用线程分割错误

C 以基本方式使用线程分割错误,c,multithreading,pointers,segmentation-fault,malloc,C,Multithreading,Pointers,Segmentation Fault,Malloc,我正在使用pthreads编写一个非常简单的程序,但我一直遇到一个“分段错误”,我不明白为什么。该程序将用C语言编译 程序应该创建3个线程,每个线程都应该打印其编号和调用线程编号(在本例中,我只希望3个线程说“我是线程(i),调用线程是0”,因为它们都是从同一个线程创建的) 我认为,问题在于用于分配要传递的内存的malloc函数 如果这是te问题,我如何解决它 我是否应该在“for”循环之前创建一个由3个指针组成的数组,并在该数组的每个指针中存储要传递给线程的两个变量?如何真正做到这一点?我试过

我正在使用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);
}