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 357
공지 [공지] 도움요청을 위한 게시판 입니다. woos 2016.04.09 172
27 커널 스터디 20기 모집 시기 질문드립니다. Drag0n 2023.01.11 340
26 애플 실리콘 맥으로 커널 빌드하는 방법에대해 알려주실 수 있나요? Chikako 2022.10.29 177
25 커널 19기 공지가 있었나요? [2] ilya 2022.05.07 251
24 2022년도 스터디 신청했는데 연락을....받으셨나요?? [4] 조나스 2022.05.06 214
23 커널을 분석하고싶어서 가입는 했는데 어떻게 해야 할지 모르겠습니다. [1] ilya 2022.02.28 247
22 다음 스터디 모집 전까지 어떤 준비를 하면 좋을까요 [1] 신마로 2022.01.10 188
21 도전! 임베디드 OS만들기 관련 문의드립니다. ㅜㅜ (6장 exception 관련 문의) [2] shin리눅스 2021.12.16 249
20 리눅스 커널 아주 좋은 강의 처럼 보이는데 서비스를 지원하지 않네요 albait 2021.10.20 163
19 커널 공부 어디서부터 시작해야 하나요? [2] julio.cesar 2021.08.11 450
18 독학 문의드립니다 Drpid 2021.05.03 218
17 문의드립니다.전문가님의 도움이 필요합니다. [4] 노력자 2020.05.01 273
» 멀티 스레드와 싱글 스레드의 시간차이를 구하는데 멀티스레드가 느리게 나옵니다. [2] NODAGA 2020.05.13 680
15 커널공부 책 질문이 있습니다 [1] btoast 2020.05.29 427
14 Osek os에 대한 문의드립니다. 노력자 2020.05.10 161
13 리눅스 멀티스레드 시간측정 코드 [1] file 뇨뇸 2020.05.03 200
12 리눅스 커널 소스 위치 (?) [2] file AlanWalker 2020.03.25 1179
11 New to IARMROOT - Advice on how to study kernel. [1] Aparna 2019.03.08 854
10 커널 스터디 중도 참여 가능여부 질문드립니다 minmon 2018.08.09 349
9 케라스(keras) 입문용 도서/강의 추천 부탁드립니다. david 2018.04.17 453
8 이번 i am root 스터디 지원자 입니다 js뚝섬 2018.04.12 383
XE Login