2009-09-29 5 views
1

스레드가 N 개 있고 공유 데이터에서 작업해야합니다.C 스레드에서 스레드를 병렬화하는 방법

나는 다음과 같은 구조를 사용하고 있습니다 :

int main(){ 
    pthread_create(..., func, ...); 
} 

void *func(void *id){ 
    lock; 
    do_job; 
    unlock; 
} 

내 문제는 스레드가 순차적으로 작동하는 것이다. 실제로 어떻게 평행하게 만드는가?

+0

무엇이 잠금을 보호합니까? –

+1

하나의 CPU/코어를 사용한다면 결코 병렬 처리를 얻지 못한다는 것을 기억하십시오. 그것은 당신이 그것의 rigth 경우 그냥 것처럼 보일 것입니다. – eaanon01

답변

6

전체 작업에서 잠금을 유지하기 때문에 일련 번호가 지정됩니다. (이 스레드 또는 다른 parallelised 아무것도에서와 같이)

void func(void *id) { 
    lock; 
    do something serialised with shared data; 
    unlock; 

    do something that can be parallelised safely; 

    lock; 
    do something else with shared data; 
    unlock; 
} 

트릭을 당신이 일의 균형을 위해서에는 직렬화하기 위해 필요로하는 곳에 일하고있다 : 실제로 병렬 처리를 얻으려면처럼 뭔가를해야 할 것입니다. 이것은 이 아니고입니다.

+0

예제에서 스레드는 하나뿐입니다. 다중 쓰레드를 생성한다면, 생성 된 쓰래드에서 pthread_join을 main에 쓰고 싶을 것이다. 주 스레드가 스레드 (가능성이 높습니다) 전에 종료하면 다른 스레드가 죽을 것이라고 확신합니다. – Vitali

+0

나는 요점이 잘 잡혔다 고 생각한다. –

0

스레드가 실행되도록 예약되어있는 순서는 몇 가지에 따라 달라집니다

  • 스레드 우선 순위
  • 스케줄 정책
  • 작업 속성을.

    단일 CPU에서 일부 스레드가 차단되지 않으면 (예 : I/O 대기로 인해) 여러 스레드를 생성해도 프로그램이 빠르게 실행되지 않습니다. 대신 작업 전환 오버 헤드 때문에 프로그램이 느려질 수 있습니다.

또한 concurrency and parallelism의 차이에 주목하십시오.

0

가능한 한 작게 잠금 장치를 잡습니다. 그렇지 않으면 실행 순서가 순차적 인 작업으로 변합니다 (스레드 N은 리소스를 실행하고 잠급니다. 이제 다른 스레드가 작업을 다시 시작하기 전에 스레드 N이 완료되어야합니다. 스레드 N이 완료되고 스레드 N + 1이 실행됩니다. 잠금 장치 등을 가정합니다.). 또한 메모리 I/O 액세스 (임의로 잠금이 보호하는 것으로 가정하는)를 계산으로 인터리빙하여 어느 정도의 병렬 처리를 달성하십시오.

관련 문제