이 필요하지 않습니다.하지만 다소 편리합니다. rand
및 strtok
과 같은 일부 기능은 스레드간에 공유 할 때 문제가 될 수있는 정적 저장 기간 정보를 사용합니다.
각 스레드마다 다른 순서 (따라서 시드)를 유지하려는 임의의 숫자 기능이 있다고 가정 해보십시오. 두 가지 접근법이 있습니다.
당신은 미봉책 같은 것을 사용할 수 있습니다 : 씨앗이있다
int seed;
srand (&seed, time (NULL));
int r = rand_r (void *seed);
호출자에 의해 생성 된 각각의 시간에 전달 될 수 있습니다.
아니면 오히려 더 좋은, ISO 규격을 사용할 수 있습니다 쓰레드 고유의 씨앗을 유지하기 위해 스레드 로컬 저장소를 사용
srand (time (NULL));
int r = rand();
. 마찬가지로 처리 할 문자열 내의 위치와 관련하여 strtok
에서 사용하는 정보와 유사합니다.
그런 식으로 스레드 버전과 비 스레드 버전간에 코드를 변경하지 않아도됩니다.
이제 은이 스레드 기능에서 정보를 작성할 수 있지만 전달되지 않고 rand
함수가 주소를 알게되는 방법은 무엇입니까? 그리고 rand
을 87 스택 레벨이라 부르면 어떨까요? 포인터를 전달하는 것은 엄청나게 많은 수준입니다. 당신은 같은 것을 할 경우에도
그리고, :
void pthread_fn (void *unused) {
int seed;
rand_set_seed_location (&seed);
:
}
및 rand
이후 그 여전히 표준에서 코드 변경의 관계없이 스택에 얼마나 깊은의 값을 사용합니다. 그것은 작동하지만 COBOL에서 운영 체제를 작성할 수도 있습니다. 즉,
모든 전역 변수는 기본적으로 모든 스레드간에 공유됩니다. IIRC에서는 스레드 특정 데이터를 사용하여 변수 이름이 동일하지만 스레드 특정 인 경우를 지정할 수 있습니다. – Kakira