C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[73489] std::thread 오류 (질문 수정)
efas44 [] 4101 읽음    2016-03-28 22:20
#include 

bool plag = true;

struct vote {

    int cnt, sub[4];

    vote() {

        int i;

        for (i = 1; i <= 3; i++) {

            sub[i] = 0;

        }

        cnt = 0;

    }

} abc[3];

void input() {

    int loop, i, j, imsi;

    scanf("%d", &loop);

    for (i = 0; i < loop; i++) {

        for (j = 0; j < 3; j++) {

            scanf("%d", &imsi);

            abc[j].cnt += imsi;

            abc[j].sub[imsi]++;

        }

    }

}

bool whats(const int a, const int b) {

    int i;

    for (i = 3; i >= 1; i--) {

        if (abc[b].sub[i] < abc[a].sub[i]) return true;

        else if (abc[b].sub[i] > abc[a].sub[i]) return false;

    }

    plag = false;

    return false;

}

void process() {

    int i, max = -1, imsi, cnt;

    for (i = 0; i < 3; i++) {

        if (max < abc[i].cnt) {

            max = abc[i].cnt;

            cnt = 1;

            imsi = i;

        }

        else if (max == abc[i].cnt) cnt++;

    }

    if (cnt > 1) {

        imsi = 0;

        for (i = 1; i < 3; i++) {

            if (max == abc[i].cnt && whats(i, imsi)) imsi = i;

        }

    }

    if (plag) printf("%d %d\n", imsi + 1, max);

    else printf("%d %d\n", 0, max);

}

int main() {

    input();

    process();

    return 0;

}



#include 

#include 




bool plag = true;




struct vote {

    int cnt = 0, sub[4] = { 0 };

} abc[3];




void in()

{

    int j, imsi;




    for (j = 0; j < 3; j++) {

        scanf("%d", &imsi);

        abc[j].cnt += imsi;

        abc[j].sub[imsi]++;

    }

}




void input() {

    int loop, i;

    std::thread* th;




    scanf("%d", &loop);




    in();





    th = new std::thread[loop-1];





    for (i = 0; i < loop-1; i++) {

        th[i] = std::thread(in);

    }




    for (i = 0; i < loop-1; i++) {

        th[i].join();

    }




    delete[] th;

}




bool whats(const int a, const int b) {

    int i;




    for (i = 3; i >= 1; i--) {

        if (abc[b].sub[i] < abc[a].sub[i]) return true;

        else if (abc[b].sub[i] > abc[a].sub[i]) return false;

    }




    plag = false;

    return false;

}




void process() {

    int i, max = -1, imsi, cnt;




    for (i = 0; i < 3; i++) {

        if (max < abc[i].cnt) {

            max = abc[i].cnt;

            cnt = 1;

            imsi = i;

        }

        else if (max == abc[i].cnt) cnt++;

    }




    if (cnt > 1) {

        imsi = 0;

        for (i = 1; i < 3; i++) {

            if (max == abc[i].cnt && whats(i, imsi)) imsi = i;

        }

    }




    if (plag) printf("%d %d\n", imsi + 1, max);

    else printf("%d %d\n", 0, max);

}




int main() {

    input();




    process();




    return 0;

}
 


입력의 첫째 줄에는 반의 학생들의 수 N(3≤N≤1,000)이 주어지고 다음 N개의 각 줄에는 각 학생이 제출한 회장후보 3명에 대한 선호 점수가 주어지며 첫 번째 점수는 후보 1번에 대한 점수이고 두 번째 점수는 후보 2번에 대한 점수이고 세 번째 점수는 후보 3번에 대한 점수입니다. 이 세 점수는 서로 다르며, 1, 2, 3이 정확히 한 번씩 나타납니다. 위의 코드는 원래 코드이고 아래는 std::thread 클래스를 부분적으로 적용해보았습니다. 문제점은 첨부한 사진에서 보시듯이 입력한 값이 같은데도 맨아래의 출력되는 결과값이 다르게 나옵니다. 저 입력값의 올바른 출력값은 "3 101" 입니다. 디버깅을 해보면 입력받을때 in()함수 내부에서 입력받을때 변수를 입력받는 순서... 즉 in함수내부의 for문이 한번에 입력받는것이 아닌 스레드중 이미 작업을 마친것이 다른 스레드의 영역을 침범하여 생기는 문제로 추정되는 것 같습니다. 이에 대한 해결방법을 제시해주세요.

+ -

관련 글 리스트
73489 std::thread 오류 (질문 수정) efas44 4101 2016/03/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.