pthread参数地址与以前不同

时间:2016-08-26 04:07:09

标签: c linux multithreading

我创建了2个线程,main()将argc和argv传递给线程,因此我使用包含struct argargc的{​​{1}}。

argv

我执行我的程序:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct arg {
   int argc;
   char id[9];
   char **argv;
};

int test1(struct arg *a) {
    int argc;
    char **argv;
    argc = a->argc;
    argv = a->argv;

    if (argc > 3) {
        printf("arg 1 is %s, arg 2 is %s arg 3 is %s\n\n", *(argv+1), *(argv+2),a->id);
    }
    else {
        exit(0);
    }


    return 0;
}
int main(int argc, const char *argv[]) {
    int i;
    void *ret;
    struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3]));
    pthread_t *thread = (pthread_t *) malloc(sizeof(*thread) * atoi(argv[3]));

    for(i = 0; i < atoi(argv[3]); ++i) {
        a[i].argc = argc;
        a[i].argv  = argv;
        sprintf(a[i].id,"%d",i);
        pthread_create( &thread[i], NULL , test1 ,(struct arg *)&(a[i]));
    }

    for(i = 0; i < atoi(argv[3]); ++i) {
         pthread_join( thread[i], &ret);
    }

    return 0;
}

输出如下:

./test 1 2 2

在线程1中,argv是正确的,但在线程2中,arg 1 is 1, arg 2 is 2 arg 3 is 0 arg 1 is , arg 2 is arg 3 is 1 地址与以前不同。

我使用gdb打印a-&gt; argv地址

    主argv地址中的
  • 是0x7fffffffdee8
  • 线程1中的
  • argv地址为0x7fffffffdee8
  • 线程2中的
  • argv地址为0x7ffff6fef700

[切换到线程0x7ffff6fef700(LWP 19472)]

argv地址与线程地址相同

我在pthread_create

之前检查arg [1] - &gt; argv

地址为0x7fffffffdee8。

argv会改变地址吗?

我有什么遗失的吗?

2 个答案:

答案 0 :(得分:4)

这一行

struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3]));

没有分配适量的内存。它应该是sizeof(struct arg)。你正在分配一个n个结构的数组,所以你需要结构本身的大小,而不是指向它的指针。

我必须清理很多东西才能编译。您应该在编译器中打开警告并修复它们。

答案 1 :(得分:3)

在这一行中,你分配的空间太小了:

struct arg *a = (struct arg *) malloc(sizeof(struct arg *) * atoi(argv[3]));

应该更像是:

struct arg *a = (struct arg *) malloc(sizeof(*a) * atoi(argv[3]));

你不应该篡改main()的定义; const不属于其类型(请参阅What should main() return in C and C++,其中也包含参数和返回值)。

您还应该使您的线程功能符合void *test1(void *vp);这是线程函数的类型。例如:

static void *test1(void *vp)
{
    struct arg *a = vp;
    int argc = a->argc;
    char **argv = a->argv;
    …

pthread_create()来电中的演员是无根据的。

相关问题