:: 게시판
:: 이전 게시판
|
- 모두가 건전하게 즐길 수 있는 유머글을 올려주세요.
- 유게에서는 정치/종교 관련 등 논란성 글 및 개인 비방은 금지되어 있습니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
15/10/13 14:38
이걸 printf하지 말고 배열에 집어넣으면 실제로 사용할 수도 있지 않을까...
fork 대신 pthread 돌려서 값 받아오면 한정적인 경우에는 상당히 빠른 소팅이 될 듯 근데 실제로 써먹을 수 있는 경우는 거의 없을거 같군요...
15/10/13 14:43
여기선 슬립 순서대로 printf를 하고 있지만 컨테이너를 이용하면 되죠.
예를 들면 vector<int> sorted 같은걸 만들어서 스레드가 종료되는 순서대로 sorted.push_back(ret); 해주면 되죠. 잠깐 생각해본거지만 돌아갈 거 같아요.
15/10/13 14:52
딱히 컨테이너 안써도 그냥 배열 잡고 카운터 만들어서 스레드 종료되면 리턴값 받아와서
array[counter] 위치에 집어넣고 counter++ 하면 되지 않나요...될 거 같은데...
15/10/13 15:21
대충 테스트 해봤는데 잘 되네요 크크크
unity C# 에서 StartCoroutine - IEnumerator 랑 yield return null 이용 했습니다. public int arrayCount = 0; public int[] randArrays; public int[] resultArray; // Use this for initialization void Start () { randArrays = new int[Random.Range(10, 20)]; for (int i=0; i<randArrays.Length; i++) { randArrays[i] = Random.Range(i + 5, 1000); } resultArray = new int[randArrays.Length]; for (int i=0; i<randArrays.Length; i++) { StartCoroutine( sleepNull(randArrays[i])); } arrayCount = 0; } // Update is called once per frame void Update () { } IEnumerator sleepNull(int arrayNum) { for(int i=0;i<arrayNum;i++) { yield return null; } Debug.Log ("arrayNum : " + arrayNum); resultArray [arrayCount] = arrayNum; arrayCount++; } resultArray 안에 정렬된 값이 순서대로 잘 들어 오네요...대신 시간이... 본문처럼 시간으로도 해봤습니다. 마지막만 IEnumerator sleepNull(int arrayNum) { yield return new WaitForSeconds(arrayNum); Debug.Log ("arrayNum : " + arrayNum); resultArray [arrayCount] = arrayNum; arrayCount++; } 이렇게 바꾸면 되고, 시간 단위로 잘 동작 하네요..
15/10/13 14:46
그러니까, 1은 1초 기다렸다가 프린트하고, 2는 2초 기다렸다가 프린트하고, 11은 11초 기다렸다가 프린트하니까 순서대로 프린팅된다는 소스인거죠?
15/10/13 15:15
그냥 멀티프로세서 실행 환경에 따라 extream한 경우 잘못작동할수도 있는거 아닌가요? fork하는 도중 중간에 뭐가 끼어들어서 몇초씩 잡아먹으면 그냥 틀린것 같은데...
15/10/13 15:41
알기 쉽게 말하자면 순서를 크기 순서대로 정렬하는데 기존에 있는 여러 정렬 방식은 어쨌거나 숫자들을 비교하면서 정렬하는데 저거는...
5 <- 넌 5초뒤에 출력되라 1 <- 넌 1초뒤 2 <- 넌 2초뒤 .... 고로 1초뒤에 1이 2초뒤에 2가... 마지막으로 11초뒤에 11이 출력됨으로써 정렬이 완료됩니다;; 시간과 리소스(숫자 하나하나마다 프로세스를 띄우므로;;) 를 무지막지하게 낭비하지만 발상이 독특한;;; 기법이자 결과가 프린트로밖에 남지않는.. 쓸데없이 고퀄? 인 방식이네요.
15/10/13 15:43
Child process들이 어차피 sleep 상태에 가기 때문에 CPU 자원 소모는 그리 문제되지 않을 것으로 보입니다.
문제는 윗분이 말씀하신 것처럼 sorting time이 O(max(v))인 것과... 일반적으로 리눅스에서 user 당 max process 수를 정해두기 때문에 숫자 개수가 10000~20000개를 넘어가면 동작하지 않는다는 것 정도? Sleep의 길이가 너무 짧아지면 race condition에 관련된 이슈가 있을 것 같기도 하고...
15/10/13 17:16
무릎을 탁! 치고 갑니다 ^^
위에서들 말씀하시는대로, printf 대신 적절한 자료구조에 리턴값을 (경쟁적으로) 넣는 것으로 하고 슬립 값을 초단위 대신 가능한한 작은 단위로 슬립하게 하면 나름 쓸만한 성능이 나오지 않을까요? 흐흐... ps. 하지만 결과값 넣는 자료구조 사용할때 세마포를 쓰는 걸로 망할듯...
|