2つのスレッドを作成し、main()がスレッドにargcとargvを渡すので、argc
とargv
を含むstruct arg
を使用します。pthread引数のアドレスが以前と異なる
#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;
}
私は私のプログラムをexecし:出力がどのように見える
./test 1 2 2
:スレッド1で
arg 1 is 1, arg 2 is 2 arg 3 is 0
arg 1 is , arg 2 is arg 3 is 1
argvが正しいですが、スレッド2にargv
アドレスは、以前よりも異なっています。私はA-を印刷するためにGDBを使用
>メインargvのアドレスでARGVアドレス
- は、スレッド1のargvアドレスに0x7fffffffdee8
- ある2 ARGVアドレスが0x7ffff6fef700
[スレッド0x7ffff6fef700(LWP 19472)に切り替える]
argvアドレスはthです電子スレッドアドレスと同じ
私は引数を確認し、[1] - > argvのpthread_createの
前のアドレスが0x7fffffffdee8です。
Will pthread_create
住所を変更しますか?
紛失しているものがありますか?
あなたがその番号を必要とするたびに変換するのではなく、 'argv [3]'を一度整数に変換して(ゼロ、負、または大きすぎないことを確認してください) –