SMP 리눅스 커널에 pthread_barrier와 같은 기능이 있습니까?SMP 리눅스 커널의 장벽
커널이 동일한 구조의 2 개 이상의 CPU에서 동시에 작동하는 경우 pthread_barrier와 같은 장벽이 유용 할 수 있습니다. 마지막 CPU가 장벽을 실행할 때까지 모든 CPU가 해당 CPU로 들어가는 것을 중지합니다. 이 순간부터 모든 CPU가 다시 작동합니다.
SMP 리눅스 커널에 pthread_barrier와 같은 기능이 있습니까?SMP 리눅스 커널의 장벽
커널이 동일한 구조의 2 개 이상의 CPU에서 동시에 작동하는 경우 pthread_barrier와 같은 장벽이 유용 할 수 있습니다. 마지막 CPU가 장벽을 실행할 때까지 모든 CPU가 해당 CPU로 들어가는 것을 중지합니다. 이 순간부터 모든 CPU가 다시 작동합니다.
당신은 아마 완료하여 해당 동작을 얻을 수 있습니다 ... 지금 매우 궁금 :
struct fake_barrier_t {
atomic_t count;
struct completion comp;
}
/* run before each pass */
void initialize_fake_barrier(struct fake_barrier_t* b)
{
atomic_set(&b->count, 0);
init_completion(&b->comp);
}
/* make all tasks sleep until nth arrives, then wake all. */
void fake_barrier(struct fake_barrier_t* b, int n)
{
if (atomic_inc_return(&b->count) < n)
wait_for_completion(&b->comp);
else
complete_all(&b->comp);
}
필자는 pthread_barrier() 구문에 익숙하지 않지만 커널에는 메모리 장벽에 대한 많은 옵션이 있습니다. 당신이 서로를 위해 대기하는 스레드의 집합을 강제하려는 경우
은 아마 뮤텍스 및/또는 waitqueues와 함께 뭔가를 해킹, 문서
에 대한 lxr memory barriers 참조 - 내가하면 잘 모르겠어요하지만 너는 그렇게하고 싶어. 언제 쓰레드가 서로를 기다리고 싶습니까? 나는
+1 좋은 답변입니다. 이런 식으로 생각하고 있었지만 실제로 구현했습니다. –
아주 좋은; 이것은 실제로 장벽을 구현하는 깨끗한 방법입니다. –