【问题标题】:Segmentation fault (core dumped) at pthread_joinpthread_join 的分段错误(核心转储)
【发布时间】:2021-05-21 20:30:05
【问题描述】:

我正在尝试运行这个文件,但它给出了这个错误。 出现分段错误(核心转储)。 pthread_join 处的分段错误(核心转储)。 到处跑printf,感觉肯定是这个错误。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <math.h>
#include <pthread.h>

float etime();
char *buffer;
void *foo(int kb)
{
    printf("Allocating memory\n");
    buffer = calloc(kb,sizeof(char));
    printf("Memory allocated\n");
    int i;
    printf("After i\n");
    for(i=0;i<kb;i++)
    {
        buffer[i]='z';
    }
    printf("End of for loop\n");
}
    
void et(int size)  
{
    
    int thrr;
    pthread_t num;
    etime();
    printf("Inside et \n");
    printf("Before calling create thread \n");
    thrr=pthread_create(&num,NULL,foo(size),NULL);
    printf("thrr = %d\n",thrr);
    if(thrr!=0)
    {
        printf("Cannot create thread!\n");
    
    }
    else
    {
        printf("Thread created successfully\n");
    
    }
    pthread_join(num,NULL);
    
    printf("Time taken = %f\n",etime());
}
    

【问题讨论】:

  • foo(size)。编译器不会为此发出警告吗?该参数必须是函数指针,而不是调用函数的结果。并且参数通过pthread_create中的最后一个参数传递给线程函数。总之,您没有正确调用pthread_create,应该检查如何做到这一点。
  • 为什么foo()没有return声明时声明返回指针?

标签: c linux multithreading pthread-join


【解决方案1】:

pthread 处理程序的签名是 void *handler(void *)

切换

void *foo(int kb)

void *foo(void *kb)

使用指向数据的指针调用处理程序:

thrr = pthread_create(&num, NULL, foo, &size);

然后,获取处理程序内部传递的int的值:

void *foo(void *data)
{
    int kb = *(int *)data;

您还需要注意size 超出范围,尽可能尝试传递常量值,即:

thrr = pthread_create(&num, NULL, foo, (void *)(uintptr_t)size);

然后,在处理程序中:

void *foo(void *data)
{
    int kb = (int)(uintptr_t)data;

uintptr_t 需要#include &lt;inttypes.h&gt;

【讨论】:

  • 请注意,这只是安全的,因为父级在 size 超出范围之前加入线程。
  • @DavidRanieri 感谢您的帮助!它奏效了。
猜你喜欢
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2021-06-03
相关资源
最近更新 更多