gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:11 25 4
gpt4 key购买 nike

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

代码如下:

#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 输出为:

argc = 6

1,f2
Thread created successfully

2,f4
Thread created successfully
3, (null)

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

更新:

 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 或 argvi[i]。

最佳答案

有问题

pthread_create (&(threads[i]), NULL,
removeBytes(i+1,&argv[i+1]), NULL);

pthread_create 的语法是

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);

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

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

pthread_create (&(线程[i]), NULL, 删除字节,argv[i+1]);

关于c - 使用线程时出现段错误 - c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com