2016-10-10 2 views
-2

스레드를 동기화하려고 할 때 문제가 있습니다. 나는이 프로그램을 실행하면C에서 스레드를 동기화 할 수 없습니다

static void* CarProcess(void *str); 

int main() 
{ 
    thread_t *pthreadsArray; 
    pthreadsArray = (thread_t*)malloc(sizeof(thread_t) * 10); 

    for (int i = 0; i < 10; i++) 
    { 
     int pthread = mythread_create(&pthreadsArray[i], NULL, CarProcess, i); 
    } 
    for (int i = 0; i < 10; i++) 
    { 
     mythread_join(pthreadsArray[i], NULL); 
    } 
} 

static void* CarProcess(void *str) 
{ 
    while(1){ 
     printf("Thread ID: %i\n", str); 
    } 
} 

, 나는이 출력이 :

Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
Thread ID: 0 
... 

을하지만 결코 "스레드 ID : 1"표시되지 않습니다 "스레드 ID : 2", "스레드 나는 다음 코드를 ID : 3 ".... 또는"스레드 ID : 9 ". 나는 뮤텍스를 사용하여 뮤텍스를 잠그고 풀어 낼 수 있다고 생각합니다. 어떤 신체가 그것을 해결하는 방법을 알고 있습니까? 감사합니다

+0

관련없는을, 하지만 실제 프로그램에 동적 인 스레드 수가 있다고 가정합니까? 그렇지 않으면'malloc'을 사용하는 것은 불필요하며 일반 배열을 사용할 수 있습니다. –

+0

또한,'mythread_create'와'mythread_join'은 무엇입니까? –

+0

@ JoachimPileborg, 고마워요하지만 스레드에 대해 많이 몰라 보인다. 만들기 및 조인 스레드 라이브러리에서 함수입니다. –

답변

2

하나의 가능한 소스는 str이 실제로는 int 변수가 아닙니다. 스레드를 만들 때와 인수를 가져올 때 둘 다 주조해야합니다.

스레드를 만들고 올바르게 정수를 전달하려면 intptr_t으로 값을 변환해야합니다. standard integer type은 정수 또는 포인터를 모두 수용 할만큼 충분히 커야합니다. 그런 다음 일반적인 포인터 (즉, void *)에 캐스팅해야합니다

pthread_create(&pthreadsArray[i], NULL, CarProcess, (void *) (intptr_t) i); 

그럼 당신은 반대 캐스팅 할 필요가 스레드 함수 내부의 정수 값을 얻을 : 귀하의 질문에

static void* CarProcess(void *str) 
{ 
    int i = (int) (intptr_t) str; 
    printf("Thread ID: %i\n", i); 
} 
+0

고마워요,하지만 문제는 변수 캐스팅에 없습니다 .. 스레드를 동기화하고 있습니다 .. 멀티 스레딩이 필요합니다 .. –

+2

@ArturoSalas 코드가 정확히 무엇인지 보여 주면 모든 동기화가 필요 없습니다. 어떤 스레드도 공유 데이터에 액세스하지 않습니다. 동기화는 다른 스레드가 읽는 동안 한 스레드가 수정할 수있는 방식으로 공유 데이터에 액세스하는 경우에만 필요합니다. –

+0

첫 번째 스레드에서만 메시지를 인쇄하고 다른 9 스레드는 인쇄하지 않습니다.이 스레드는 멀티 스레드가 아닙니다 –

관련 문제