2017-02-02 1 views
0

for 루프의 인덱스를 래퍼 객체를 통해 pthread_create의 인수에 전달하고 싶습니다. 그러나 스레드에서 인쇄 된 정수가 올바르지 않습니다. 아래의 코드가 특별한 순서없이 인쇄 될 것으로 예상했습니다.for 루프 인덱스를 C에서 pthread_create 인수 객체로 전달

ID는이 대신 정수 1,3 스레드

로 전달되지 않는다 인쇄 그러나 ID가 3이며, ID는 2, 번호가 1, 0

인 ID는 0, ID는 0, ID가, ID가 2이고, 0

struct thread_arg { 
int id; 
void * a; 
void * b; 
} 

void *run(void *arg) { 
struct thread_arg * input = arg; 
int id = input->id; 
printf("id is %d, ", id) 
} 

int main(int argc, char **argv) { 
for(int i=0; i<4; i++) { 
    struct thread_arg arg; 
    arg.id = i; 
    arg.a = ... 
    arg.b = ... 
    pthread_create(&thread[i], NULL, &run, &arg); 
} 

}

답변

1

struct thread_arg은 자동 저장 장치이며 해당 범위는 for 루프 내에 만 존재합니다. 게다가, 이것들은 메모리에 1 개 밖에 없으며, 같은 thread를 각각의 다른 thread에 건네줍니다. 이 동일한 객체의 ID를 4 번 수정하고 작업자 스레드에서 해당 ID를 인쇄하는 사이에 데이터 경합을 만들 수 있습니다. 또한 for 루프가 존재하면 해당 메모리가 범위를 벗어나 더 이상 유효하지 않습니다. 여기에 쓰레드를 사용하고 있기 때문에 스케쥴러는 메인 쓰레드 나 임의의 자식 쓰레드를 자유롭게 실행할 수 있기 때문에 프린트 아웃에 대한 일관성없는 동작을 기대합니다. 자식 스레드에 전달하기 전에 각각 struct thread_arg 또는 malloc 배열을 만들어야합니다.

#define NUM_THREADS 4 

struct thread_arg { 
    int id; 
    void * a; 
    void * b; 
} 

void *run(void *arg) { 
    struct thread_arg * input = arg; 
    int id = input->id; 
    printf("id is %d, ", id) 
} 

int main(int argc, char **argv) { 
    struct thread_arg args[NUM_THREADS]; 
    for(int i=0; i<NUM_THREADS; i++) { 
    args[i].id = i; 
    args[i].a = ... 
    args[i].b = ... 
    pthread_create(&thread[i], NULL, &run, &args[i]); 
    } 

    // probably want to join on threads here waiting on them to finish 
    return 0; 
} 
+0

작동합니다! 도와 주셔서 감사합니다 :) – GucciProgrammer