首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用线程-c时出现分段错误

使用线程-c时出现分段错误
EN

Stack Overflow用户
提问于 2013-11-01 00:27:53
回答 4查看 4.9K关注 0票数 0

这是我第一次使用线程,我从一个简单的程序开始。该程序接受n参数并创建n-2线程。问题是我得到了一个分割错误,我不知道为什么。

代码如下:

代码语言:javascript
复制
#include <stdio.h>  
#include <string.h> 
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>

void *
removeBytes (int i, char* argv[])
{
  printf ("%d, %s\n", i, argv[i]);
  return NULL;
}  


int main (int argc, char *argv[])
{

  pthread_t threads[argc - 3];
  int err;
  int i;  
  int *ptr[argc - 3];

  printf ("argc = %d\n", argc);

  for (i = 0; i < argc -3; i++)
    {
      err =
        pthread_create (&(threads[i]), NULL,
                        removeBytes(i+1,&argv[i+1]), NULL);
      if (err != 0)
        {
          printf ("\nCan't create thread: [%d]", i);
        }
      else
        { 
          printf ("\nThread created successfully\n");
        }
    }

  for (i = 0; i < argc - 3; i++)
    {
      pthread_join (threads[i], (void **) &(ptr[i]));
      printf("pthread_join - thread %d",i);
    }

  return 0;
}

示例:我的程序名为mythread,所以当我运行它./mythread f1 f2 f3 f4 f5 f6时,输出是:

代码语言:javascript
复制
argc = 6

1,f2
Thread created successfully

2,f4
Thread created successfully
3, (null)

为什么它将f2作为argv[1],将f4作为argv[2]

更新:

代码语言:javascript
复制
 typedef struct{
    int i;
    char* argv;
  }Data;

  void* removeBytes(void* arg){
    Data* data = (Data*)arg;   
    printf("%d, %s\n",data->i, data->argv);
    free(data);
    return NULL;
  }



  int main(int argc, char** argv){
    Data* data;

    pthread_t threads[argc-3];

    int i;
    int err;
    for(i=0; i < argc-3;i++){
      data = (Data*)malloc(sizeof(Data));
      data->i=i+1;
      data->argv=argv[i+1];
      err = pthread_create(&(threads[i]),NULL,removeBytes,data);
      if(err != 0){
        printf("\nCan't create thread %d",i);
      }
      else{
        printf("Thread created successfully\n");
      }
    }  

    return 0;
  }

对于./mythread f1 f2 f3 f4 f5 f6 f7 f8,输出为:

5 x“线程创建成功”。它不打印i或argvii。

EN

回答 4

Stack Overflow用户

发布于 2013-11-01 00:38:50

您没有正确使用pthread_create

代码语言:javascript
复制
pthread_create (&(threads[i]), NULL,
                        removeBytes(i+1,&argv[i+1]), NULL);

在这里,您只是调用removeBytes()并将结果(NULL)作为pthread_create()的参数传递。

代码语言:javascript
复制
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

第三个参数应该是指向void* myThread(void*)函数的指针。如果要将参数传递给线程,则应使用void*参数并将其作为pthread_create的第三个参数传递。

您可以查看this,以了解如何使用pthread库。

此外,您可能想要执行以下操作:

代码语言:javascript
复制
typedef struct {
    int i;
    char* argv;
} Data;

void * removeBytes (void* arg)
{
  Data* data = (Data*) arg;
  printf ("%d, %s\n", data->i, data->argv);
  free(data);
  return NULL;
}

然后像这样创建线程:

代码语言:javascript
复制
Data* data = (Data*)malloc(sizeof(Data));
data->i = i;
data->argv = argv[i+1];
err = pthread_create (&(threads[i]), NULL, removeBytes, data);
票数 0
EN

Stack Overflow用户

发布于 2013-11-01 00:39:26

使用

代码语言:javascript
复制
pthread_create (&(threads[i]), NULL,
                    removeBytes(i+1,&argv[i+1]), NULL);

您正在调用removeBytes(),而不是将其作为参数传递。

此外,您只能将一个参数传递给线程函数。所以你需要在一个结构中放入多个参数。类似于:

代码语言:javascript
复制
struct thread_args {
    int i;
    char *argv;
}

#your main code
struct thread_args *thargs;

for (i = 0; i < argc -3; i++)
{
  thargs = malloc(sizeof(*thargs));
  thargs->i = i+1;
  thargs->argv = argv[i+1];
  err =
    pthread_create (&(threads[i]), NULL,
                    removeBytes, thargs);
  if (err != 0)
    {
      printf ("\nCan't create thread: [%d]", i);
    }
  else
    { 
      printf ("\nThread created successfully\n");
    }
}
#make sure to free up thargs as well.

update线程函数

代码语言:javascript
复制
void *removeBytes (void *arg)
{
  int i;
  char *argv;
  struct thread_args *thargs =  (struct thread_args *) arg;
  i = thargs->i;
  argv = thargs->argv;
  printf ("%d, %s\n", i, argv);
  return NULL;
} 
票数 0
EN

Stack Overflow用户

发布于 2013-11-01 00:41:01

存在以下问题:

代码语言:javascript
复制
pthread_create (&(threads[i]), NULL,
                    removeBytes(i+1,&argv[i+1]), NULL);

pthread_create的语法是

代码语言:javascript
复制
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                      void *(*start_routine) (void *), void *arg);

它将启动例程作为回调。在您的示例中,您将在主线程中调用removeBytes,该线程在生成之前并返回NULL。因此,回调为空。

因此,根据需要相应地修改您的removeBytes,并调用

线程(&( pthread_create ),NULL,removeBytes,argvi+1);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19711861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档