ubuntu에서 돌리면 제목 그대로 멀티스레드가 싱글 스레드보다 시간이 더 오래 걸린다고 측정이 됩니다.

그런데 Dec C++에서 돌리면 멀티스레드가 더 빠르다고 나옵니다.

싱글스레드와 멀티스레드 둘다 코드 올릴테니 뭐가 잘못됬는지 봐주시면 감사하겠습니다.

일단 멀티스레드 입니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>

int cnt = 0;
#define NUM_THREADS 10

bool cntPrime(int num){
    int ct = 0;
    int i;
    if(num < 2) return false;
    
    for(i = 1; i*i<num; i++){
        if(num%i == 0) ct++;
    }
    if(i*i == num) ct++;
    if(ct == 1) return true;
    else return false;
}

struct thread_args{
    int myid;
    long long start;
    long long end;
};

void* myfunc(void *arg){
    struct thread_args *myarg = (struct thread_args *) arg;
    int i;
    for(i = myarg->start; i <= myarg->end; i++){
        if(cntPrime(i) == true)
            cnt++;
    }
    pthread_exit(NULL);
}

int main(int argc, char* argv[]){
    num = 1000000;
    printf("input number: %d\n", num);
    
    pthread_t mythread[NUM_THREADS];
    struct thread_args range[NUM_THREADS];
    
    for(int i = 0; i < NUM_THREADS; i++){
        range[i].myid = i;
        range[i].start = (num/NUM_THREADS)*i+1;
        range[i].end = (num/NUM_THREADS)*(i+1);
    }
    
    clock_t begin_time = clock();
    for(int i = 0; i < NUM_THREADS; i++)
        pthread_create(&mythread[i], NULL, myfunc, &range[i]);

    for(int i = 0; i < NUM_THREADS; i++){
        pthread_join(mythread[i], NULL);
    }
    clock_t end_time = clock();
    
    printf("cnt: %d\n", cnt);
    double elapsed_time = (double)(end_time - begin_time)/CLOCKS_PER_SEC;
    printf("elapsed time: %f sec \n", elapsed_time);
}

 

다음은 싱글 스레드입니다.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>

bool cntPrime(int num){
    int cnt = 0;
    int i;
    if(num < 2) return false;
    
    for(i = 1; i*i<num; i++){
        if(num%i == 0) cnt++;
    }
    if(i*i == num) cnt++;
    if(cnt == 1) return true;
    else return false;
}

int main(int argc, char* argv[]){
    int cnt = 0;
    int num = 1000000;
    printf("input number: %d\n", num);
    
    clock_t begin_time = clock();
    for(int i = 2; i <= num; i++){
        if(cntPrime(i) == true){
            cnt++;
        }
    }
    clock_t end_time = clock();
    printf("cnt: %d\n", cnt);
    double elapsed_time = (double)(end_time - begin_time)/CLOCKS_PER_SEC;
    printf("elapsed_time: %f sec\n", elapsed_time);
}

번호 제목 글쓴이 날짜 조회 수
공지 [마감] ARM 리눅스 커널 2판 알파 리더를 모집합니다. 구본규 2017.08.14 286
공지 [공지] 도움요청을 위한 게시판 입니다. woos 2016.04.09 132
18 리눅스 커널 아주 좋은 강의 처럼 보이는데 서비스를 지원하지 않네요 albait 2021.10.20 54
17 커널 공부 어디서부터 시작해야 하나요? [2] julio.cesar 2021.08.11 159
16 독학 문의드립니다 Drpid 2021.05.03 112
15 문의드립니다.전문가님의 도움이 필요합니다. [4] 노력자 2020.05.01 179
» 멀티 스레드와 싱글 스레드의 시간차이를 구하는데 멀티스레드가 느리게 나옵니다. [2] NODAGA 2020.05.13 287
13 커널공부 책 질문이 있습니다 [1] btoast 2020.05.29 274
12 Osek os에 대한 문의드립니다. 노력자 2020.05.10 77
11 리눅스 멀티스레드 시간측정 코드 [1] file 뇨뇸 2020.05.03 101
10 리눅스 커널 소스 위치 (?) [2] file AlanWalker 2020.03.25 700
9 New to IARMROOT - Advice on how to study kernel. [1] Aparna 2019.03.08 770
8 커널 스터디 중도 참여 가능여부 질문드립니다 minmon 2018.08.09 309
7 케라스(keras) 입문용 도서/강의 추천 부탁드립니다. david 2018.04.17 392
6 이번 i am root 스터디 지원자 입니다 js뚝섬 2018.04.12 337
5 안녕하세요 이번에 가입한 "나불이"입니다. 스터디 모집 문의 드립니다. 나불이 2017.12.04 225
4 NAVER 세미나실 지원에 대한 질문 [3] 아이엠푸 2016.04.24 1161
3 안녕하세요 OS개발 그룹입니다.플랫폼 선정관련 조언 바랍니다. [4] 찰떡이네 2016.04.25 700
2 안녕하세요 초보 커널모듈 개발자가 질문 혹은 도움 요청드립니다. 샹삐 2016.04.11 639
1 점점 미궁속으로 빠져드는 프로젝트. [2] 백창우 2008.12.02 6785
XE Login