스레드가 N 개 있고 공유 데이터에서 작업해야합니다.C 스레드에서 스레드를 병렬화하는 방법
나는 다음과 같은 구조를 사용하고 있습니다 :
int main(){
pthread_create(..., func, ...);
}
void *func(void *id){
lock;
do_job;
unlock;
}
내 문제는 스레드가 순차적으로 작동하는 것이다. 실제로 어떻게 평행하게 만드는가?
스레드가 N 개 있고 공유 데이터에서 작업해야합니다.C 스레드에서 스레드를 병렬화하는 방법
나는 다음과 같은 구조를 사용하고 있습니다 :
int main(){
pthread_create(..., func, ...);
}
void *func(void *id){
lock;
do_job;
unlock;
}
내 문제는 스레드가 순차적으로 작동하는 것이다. 실제로 어떻게 평행하게 만드는가?
전체 작업에서 잠금을 유지하기 때문에 일련 번호가 지정됩니다. (이 스레드 또는 다른 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;
}
트릭을 당신이 일의 균형을 위해서에는 직렬화하기 위해 필요로하는 곳에 일하고있다 : 실제로 병렬 처리를 얻으려면처럼 뭔가를해야 할 것입니다. 이것은 이 아니고입니다.
예제에서 스레드는 하나뿐입니다. 다중 쓰레드를 생성한다면, 생성 된 쓰래드에서 pthread_join을 main에 쓰고 싶을 것이다. 주 스레드가 스레드 (가능성이 높습니다) 전에 종료하면 다른 스레드가 죽을 것이라고 확신합니다. – Vitali
나는 요점이 잘 잡혔다 고 생각한다. –
스레드가 실행되도록 예약되어있는 순서는 몇 가지에 따라 달라집니다
작업 속성을.
단일 CPU에서 일부 스레드가 차단되지 않으면 (예 : I/O 대기로 인해) 여러 스레드를 생성해도 프로그램이 빠르게 실행되지 않습니다. 대신 작업 전환 오버 헤드 때문에 프로그램이 느려질 수 있습니다.
또한 concurrency and parallelism의 차이에 주목하십시오.
가능한 한 작게 잠금 장치를 잡습니다. 그렇지 않으면 실행 순서가 순차적 인 작업으로 변합니다 (스레드 N은 리소스를 실행하고 잠급니다. 이제 다른 스레드가 작업을 다시 시작하기 전에 스레드 N이 완료되어야합니다. 스레드 N이 완료되고 스레드 N + 1이 실행됩니다. 잠금 장치 등을 가정합니다.). 또한 메모리 I/O 액세스 (임의로 잠금이 보호하는 것으로 가정하는)를 계산으로 인터리빙하여 어느 정도의 병렬 처리를 달성하십시오.
가능하면 read/write locks을 사용하십시오.
무엇이 잠금을 보호합니까? –
하나의 CPU/코어를 사용한다면 결코 병렬 처리를 얻지 못한다는 것을 기억하십시오. 그것은 당신이 그것의 rigth 경우 그냥 것처럼 보일 것입니다. – eaanon01