2011-04-23 3 views
0

3 개의 pthread를 시작하고 응용 프로그램을 몇 번 실행 한 후 create 문 순서에 따라 스레드 생성의 정확한 순서가 없음을 알았습니다.다른 스레드가 실행되면 스레드 시작

특정 스레드가 시작되면 어떻게 다른 스레드를 만들 수 있습니까?

나는 처음부터 시작하고자하는 스레드 내부에서 필요한 스레드를 생성하는 대신 동일한 "레벨"에서 스레드를 생성하려고합니다.

+0

주 스레드가 기다리는 동시성 개체를 설정하기 시작한 스레드를 가져옵니다. 설정이 끝나면 첫 번째 스레드가 시작되었고 두 번째 등을 시작할 수 있습니다. – forsvarir

+0

스레드의 내부 특성이 순서 결정적이 아니므로 문제가되지 않도록 코드를 재정렬해야합니다! – Kevin

답변

1

스레드에는 "레벨"또는 상위/하위 관계가 없습니다. 실행중인 초기 스레드를 포함한 모든 스레드는 피어입니다. 스레드 설명자가 유효하고 스레드가 분리되지 않는 한 모든 스레드는 다른 스레드에서 pthread_join을 호출 할 수 있습니다.

주문을 실제로 시행해야하는 경우 가장 간단한 도구는 장벽 (pthread_barrier_wait)입니다. 반면에, 조건 변수는 좀 더 강력하지만 사용하기가 어렵고 아마도 이런 상황에서는 필요하지 않을 수 있습니다.

+0

전역 정수를 0으로 설정하기로 결정한 다음 스레드 내부에서 1로 설정했습니다. 그래서 1로 설정되어있을 때, 나는 메인 루프에서 if == 1을 검사하면 스레드를 시작하기 때문에 다른 스레드를 시작합니다. 나는 오히려 빌트인 함수가 있다면 그것을 사용하고자한다. barrier_wait does not는 이것에 대해 정확하다고 보입니다. – jarryd

+0

해결책이 잘못되었습니다. 중간 동기화 작업없이 다른 스레드에 의해 수정 된 변수를 읽을 수 없거나 결과가 UB입니다. –

+0

나는 조건부 pthread_cond_wait 등을 끝에 뮤텍스와 함께 사용했다. 감사 – jarryd

0

당신이 스레드 함수에서 호출는 pthread_create()를 호출 할 수 있습니까?

pthread_create는 스레드를 생성하고 사용자가 발견 한 것처럼 스레드 기능을 호출하지 않습니다. 기본적으로 새 스레드는 활성 스레드 목록에 있으며 스케줄러는 선택할 때마다 타임 슬립을 제공 할 수 있습니다. 일반적으로 이것은 몇 ms이지만 길어질 수 있습니다.

관련 문제