[問題] 想請問一下thread的關念,有程式例子

看板C_and_CPP作者 (三民)時間14年前 (2009/11/18 02:20), 編輯推噓2(206)
留言8則, 5人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 在OS課本中好像提到,Multi-thread是很多條同時進行, 我寫了一個code,會產生兩個thread, thread_return_1=pthread_create(&tid_1,&attr,test,item); thread_return=pthread_create(&tid,&attr,runner,item); 分別做以下的事 void *runner(void *param) { unsigned int tid=pthread_self(); int i; printf("A,run!\n"); for(i=0,sum=0;i<=*(int*)param;i++) { sum+=i*i; printf("==%2d==\n",sum); } printf("I'am thread,my tid is %u\n",tid); printf("A,finish!\n"); pthread_exit(0); } void *test(void *param) { unsigned int tid=pthread_self(); int temp,i; printf("B,run!\n"); for(i=0,sum_1=0;i<=*(int*)param;i++) { sum_1+=i*i; printf("__%2d__\n",sum_1); } printf("I'am thread,my tid is %u\n",tid); printf("B,finish!\n"); pthread_exit(0); } 當main產生完thread後,會跑下面 do { printf("parent_thread,waiting....\n"); } while(pthread_join(tid_1,NULL)!=0 || pthread_join(tid,NULL)!=0); 希望得到的正確結果: 我目前的觀念是,thread都是同步在進行, 假如input是5: 我以為會跑出 B,run! __ 1__ A,run! __ 5__ parent_thread,waiting.... == 1== __14__ == 5== ==14== parent_thread,waiting.... __30__ ==30== parent_thread,waiting.... ==55== A,finish! __55__ B,finish! parent_thread,waiting.... 這樣交錯的結果,但是實際上跑出來是: B,run! A,run! __ 1__ __ 5__ __14__ __30__ __55__ B,finish! == 1== == 5== ==14== ==30== ==55== A,finish! parent_thread,waiting.... 每次跑的「A,run!」、「B,run!」、「parent_thread,waiting....」 的位子都不一定 但是兩個thread的printf,都會連在一起,並沒有交錯, 請問是我觀念錯了嗎? 不好意思,謝謝各位。 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) g++ Linux -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.170.205.201

11/18 02:23, , 1F
先問一下你用的是什麼CPU呢?
11/18 02:23, 1F

11/18 02:26, , 2F
Genuine Intel(R) CPU 2140 @ 1.60Ghz
11/18 02:26, 2F

11/18 02:28, , 3F
是雙核的~ :D
11/18 02:28, 3F

11/18 19:05, , 4F
join會等到該thread全部跑完,才會繼續往下跑。Over.
11/18 19:05, 4F
※ 編輯: mine1988 來自: 140.134.27.89 (11/18 19:23)

11/18 21:44, , 5F
跟 join 無關吧... join 只是等待結束
11/18 21:44, 5F

11/18 21:44, , 6F
我想應該就是 thread 內容太少, 全部做完之後 cpu 才被拿去
11/18 21:44, 6F

11/18 21:44, , 7F
做別的事
11/18 21:44, 7F
今天有問了一下學長, 學長說要達到這樣的話,兩個thread必需同時搶到CPU才可以, 因為這個只是小程式,搞不好A thread做完的時候,B thread還在排班, 所以很難達到同時印這個條件, 如果有錯再請大家補充, 謝謝大家。 ※ 編輯: mine1988 來自: 118.170.206.248 (11/19 00:43)

11/19 03:00, , 8F
那就加個delay試試看
11/19 03:00, 8F
文章代碼(AID): #1B0kbtdV (C_and_CPP)