이 글에서는 멀티스레딩(Multi-threading) 개념을 적용하여 배열 안에서 특정 요소를 검색하는 방법을 알아봅니다. 접근 방식은 매우 간단합니다. 여러 개의 스레드를 생성한 뒤, 배열을 여러 구간으로 나누고 각 스레드가 서로 다른 구간을 담당하도록 합니다. 이후 검색 대상인 키(key) 값을 찾으면 플래그(flag) 변수를 설정하여 해당 요소의 존재 여부를 확인할 수 있습니다.
동작 원리
이 예제에서는 POSIX 스레드(pthread) 라이브러리를 사용합니다. 전체 흐름은 다음과 같습니다.
- 배열 크기는 MAX(16), 스레드 개수는 THREAD_MAX(4)로 정의합니다.
- 각 스레드는
current_thread값을 기준으로 자신이 맡은 구간(배열의 1/4씩)을 계산합니다. - 각 스레드는 자신에게 할당된 구간에서만 선형 검색을 수행하고, 키 값을 발견하면 공유 변수
flag를 1로 설정합니다. - 메인 함수는 모든 스레드가 종료될 때까지
pthread_join()으로 대기한 후, 플래그 값에 따라 결과를 출력합니다.
예제 코드
#include <stdio.h>
#include <pthread.h>
#define MAX 16
#define THREAD_MAX 4
int array[MAX] = { 1, 5, 7, 10, 12, 14, 15, 18, 20, 22, 25, 27, 30, 64, 110, 220 };
int key = 18;
int flag = 0; // 배열에 키 값이 존재하는지 나타내는 플래그
int current_thread = 0;
void* ThreadSearch(void* args) { // 모든 스레드가 실행할 선형 검색 함수
int num = current_thread++;
for (int i = num * (MAX / 4); i < ((num + 1) * (MAX / 4)); i++){
if (array[i] == key)
flag = 1; // 키 값을 찾으면 플래그 설정
}
}
int main() {
pthread_t thread[THREAD_MAX];
for (int i = 0; i < THREAD_MAX; i++) { // 여러 스레드 생성
pthread_create(&thread[i], NULL, ThreadSearch, (void*)NULL);
}
for (int i = 0; i < THREAD_MAX; i++) {
pthread_join(thread[i], NULL); // 모든 스레드가 끝날 때까지 대기
}
if (flag == 1)
printf("Key element is found\n");
else
printf("Key element is not present\n");
}실행 결과
$ gcc 1249.Thread_search.cpp -lpthread $ ./a.out Key element is found
코드 설명 및 주의 사항
스레드 함수 ThreadSearch() 내부에서 current_thread++ 연산은 여러 스레드가 동시에 접근할 수 있으므로, 실제 환경에서는 경쟁 상태(race condition)를 방지하기 위해 뮤텍스(mutex)나 원자적 연산으로 보호하는 것이 좋습니다. 또한 이 예제는 배열을 균등하게 4등분하지만, 데이터 크기가 스레드 수로 나누어떨어지지 않는 경우 마지막 구간의 범위를 별도로 처리해야 합니다.
컴파일 시에는 반드시 -lpthread 옵션을 붙여야 pthread 라이브러리가 정상적으로 링크됩니다. 멀티스레딩을 활용하면 대용량 배열에서도 검색 작업을 병렬로 분산 처리하여 탐색 속도를 크게 향상시킬 수 있다는 점이 이 기법의 가장 큰 장점입니다.