我创建了2个线程,main()将argc和argv传递给线程,因此我使用包含struct arg
和argc
的{{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地址
[切换到线程0x7ffff6fef700(LWP 19472)]
argv地址与线程地址相同
我在pthread_create
之前检查arg [1] - &gt; argv地址为0x7fffffffdee8。
argv
会改变地址吗?
我有什么遗失的吗?
答案 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()
来电中的演员是无根据的。