별도의 스레드에서 호출하려는 함수에 여러 인수를 전달해야합니다. 나는 한 읽기 이 작업을 수행하는 일반적인 방법은, 구조체를 정의하는하는 기능을 포인터를 전달하고 인수를 역 참조하는 것입니다. 그러나이 작업을 수행 할 수 없습니다.
#include <stdio.h>
#include <pthread.h>
struct arg_struct {
int arg1;
int arg2;
};
void *print_the_arguments(void *arguments)
{
struct arg_struct *args = (struct arg_struct *)args;
printf("%d\n", args -> arg1);
printf("%d\n", args -> arg2);
pthread_exit(NULL);
return NULL;
}
int main()
{
pthread_t some_thread;
struct arg_struct args;
args.arg1 = 5;
args.arg2 = 7;
if (pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0) {
printf("Uh-oh!\n");
return -1;
}
return pthread_join(some_thread, NULL); /* Wait until thread is finished */
}
이에 대한 출력은 다음과 같아야합니다.
5
7
그러나 내가 그것을 실행하면 실제로 다음을 얻습니다.
141921115
-1947974263
아무도 내가 뭘 잘못하고 있는지 알아?
답변
당신이 말하기 때문에
struct arg_struct *args = (struct arg_struct *)args;
대신에
struct arg_struct *args = arguments;
답변
사용하다
struct arg_struct *args = (struct arg_struct *)arguments;
대신에
struct arg_struct *args = (struct arg_struct *)args;
답변
main()
자체 스레드 및 스택 변수가 있습니다. 힙의 ‘args’에 대한 메모리를 할당하거나 전역으로 만듭니다.
struct arg_struct {
int arg1;
int arg2;
}args;
//declares args as global out of main()
물론 참조를 args->arg1
에서 args.arg1
등으로 변경하십시오 .
답변
사용하다:
struct arg_struct *args = malloc(sizeof(struct arg_struct));
다음과 같이이 인수를 전달합니다.
pthread_create(&tr, NULL, print_the_arguments, (void *)args);
무료 인수를 잊지 마세요! 😉
답변
print_the_arguments의 인수는 인수이므로 다음을 사용해야합니다.
struct arg_struct *args = (struct arg_struct *)arguments.
답변
struct arg_struct *args = (struct arg_struct *)args;
->이 할당이 잘못되었습니다.이 컨텍스트에서 변수 인수를 사용해야합니다. 건배!!!
답변
이 코드의 스레드 생성에서 함수 포인터의 주소가 전달됩니다. 원래
pthread_create(&some_thread, NULL, &print_the_arguments, (void *)&args) != 0
다음과 같이 읽어야합니다.
pthread_create(&some_thread, NULL, print_the_arguments, (void *) &args)
기억하는 좋은 방법은이 함수의 모든 인수가 주소 여야한다는 것입니다.
some_thread
정적으로 선언되므로 &
.
나는 만들 것이다 pthread_attr_t
다음 변수를 사용 pthread_attr_init()
거기에 그 변수의 주소를 전달합니다. 그러나 NULL
포인터 전달 도 유효합니다.
&
기능 라벨의 전면 여기에 문제를 일으키는 것입니다. 사용 된 레이블은 이미 void*
함수에 대한 것이므로 레이블 만 필요합니다.
!= 0
마지막 주장으로 말하는 것은 결정되지 않은 행동을 유발하는 것처럼 보입니다. 이를 추가하면 참조 대신 부울이 전달됩니다.
Akash Agrawal의 답변은이 코드 문제에 대한 해결책의 일부이기도합니다.
