2010-04-02 4 views
3

SMP 리눅스 커널에 pthread_barrier와 같은 기능이 있습니까?SMP 리눅스 커널의 장벽

커널이 동일한 구조의 2 개 이상의 CPU에서 동시에 작동하는 경우 pthread_barrier와 같은 장벽이 유용 할 수 있습니다. 마지막 CPU가 장벽을 실행할 때까지 모든 CPU가 해당 CPU로 들어가는 것을 중지합니다. 이 순간부터 모든 CPU가 다시 작동합니다.

답변

5

당신은 아마 완료하여 해당 동작을 얻을 수 있습니다 ... 지금 매우 궁금 :

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); 
} 
+0

+1 좋은 답변입니다. 이런 식으로 생각하고 있었지만 실제로 구현했습니다. –

+0

아주 좋은; 이것은 실제로 장벽을 구현하는 깨끗한 방법입니다. –

2

필자는 pthread_barrier() 구문에 익숙하지 않지만 커널에는 메모리 장벽에 대한 많은 옵션이 있습니다. 당신이 서로를 위해 대기하는 스레드의 집합을 강제하려는 경우

은 아마 뮤텍스 및/또는 waitqueues와 함께 뭔가를 해킹, 문서

에 대한 lxr memory barriers 참조 - 내가하면 잘 모르겠어요하지만 너는 그렇게하고 싶어. 언제 쓰레드가 서로를 기다리고 싶습니까? 나는

+0

되지 메모리 장벽 (WMB, MB, RMB)을하지만, LXR MEM 바의 synhro 장벽 – osgx

+0

하지만 thnx 링크. – osgx

+0

+1 링크 +1 –