2012-09-03 113 views
0

我的VC++ 2010快速安裝的時間在工作,已經過期,所以我不能再使用它,而不改變從右下的日期。我不想這樣做,所以我問你這些問題:簡單線程的順序

你認爲,在多線程程序的線程下面的順序工作?

如果我把類似的3多個線程計算下一個1000粒子,情景開關會耗盡還是睡眠(10)正在用盡?

注意:每個計算(。的力的每一個,VEL,POS)約需9毫秒。

Something like this: 
core1:first 1000 particles forces  // 
core2:first 1000 particles velocities //===>these 3 are connected 
core3:first 1000 particles positions // ------------------------------ 
                     | 
core4:next 1000 particles forces  //        ====these 2 will be connected 
core5:next 1000 particles velocities //===>these 3 are connected  | 
core6:next 1000 particles positions // ------------------------------ 

boolean locker1; 
boolean locker2; 
boolean locker3; 

boolean worker1; 
boolean worker2; 
boolean worker3; 

void core1(void * x) 
{ 
    while(worker1) 
    { 
     while(!locker1){Sleep(10);} 
     for(int i=0;i<1000;i++) 
     { 
       //calculate 1000 particles forces 
     } 
     locker2=true; //starts core2 thread 
     while(locker2){Sleep(10);} //core2 must be working 
     while(locker3){Sleep(10);} //core3 must be working 
    } 
    _endthread(); 
} 

void core2(void * y) 
{ 
    while(worker2) 
    { 
     if(!locker2){Sleep(10);} 
     for(int i=0;i<1000;i++) 
     { 
       //calculate 1000 particles velocities 
     } 
     locker3=true; //starts core3 thread 
     while(locker3){Sleep(10);} //core3 must be working 
     while(locker1){Sleep(10);} //core1 must be working 
    } 
    _endthread(); 

} 

void core3(void * z) 
{ 
    while(worker3) 
    { 
     if(!locker3){Sleep(10);} 
     for(int i=0;i<1000;i++) 
     { 
       //calculate 1000 particles positions 
     } 
     locker1=true; //starts core1 thread 
     while(locker1){Sleep(10);} //core1 must be working 
     while(locker2){Sleep(10);} //core2 must be working 
    } 
    _endthread(); 

} 

int main() 
{ 
    locker1=false; 
    locker2=false; 
    locker3=false; 
    worker1=true; 
    worker2=true; 
    worker3=true; 
    _beginthread(core1,0,(void *)0); 
    _beginthread(core2,0,(void *)0); 
    _beginthread(core3,0,(void *)0); 

    locker1=true; //gets the waiting core1-thread working 
        //so i think when it finishes, it releases core2 to work 
        //when core2 finishes, core3 starts working 

    Sleep(100); 
    worker1=false; 
    worker2=false; 
    worker3=false; //after a while i shut them down 

} 

請如果有任何人有VC++可以給我一些提示或建議我欣賞。

Or should i just forget the 3+3-->2 system and do this(6)? : 

core1 first 233 particles for computing forces ----->all for velocity ----->all for psoition 
core2 next 233 particles for computing forces ----->all for velocity ----->all for psoition 
core3 next 233 particles for computing forces ----->all for velocity ----->all for psoition 
core4 next 233 particles for computing forces ----->all for velocity ----->all for psoition 
core5 next 233 particles for computing forces ----->all for velocity ----->all for psoition 
core6 last 233 particles for computing forces ----->all for velocity ----->all for psoition 

and just wait all of them finish to get to next calculation? 
+0

你是要我們寫和分析你的應用程序? –

+1

您是否知道只需註冊Visual C++ 2010 Express即可在30天后繼續使用它?我的安裝已經超過兩年了,工作正常... – Blastfurnace

+0

:O我不知道。我以爲需要錢 –

回答

2

「您是否認爲,在多線程程序的線程下按順序工作?

不是。你違反了太多關於多線程編程的規則。

另外,螺紋的點是並行執行的東西。如果您需要依次執行A,B和C,請在同一個線程中執行。

+0

那麼,你說我的第二種方法更好?當然,每個核心都會爲233個粒子 –

+0

確定速度和力量。只有一個缺點,那就是你假設有6個核心可用。如果只有5個可用,則一個核心將不得不處理466個塊,並且需要兩倍的時間。在專業代碼中,我會將任務分成20個塊,每個塊包含100個粒子,並使用*線程池*來處理塊。 – MSalters

+0

好的,我會看看線程池(數組?) –

1

我實在看不出在這種情況下的想法是讓他們一起運行的線程的優勢,你的衣櫃變量似乎旨在確保在任何給定時間三個2是在睡眠中。如果是這樣,那麼爲什麼不直接在同一個線程中運行它們。在我看來,這些計算是相互依賴的,因此沒有平行線程可以幫助你。

+0

然後你說我的第二種方法會對這個睡眠事情有所幫助,對不對?等待所有6個完成。 –

+0

我認爲在不同的線程中處理粒子集是非常有用的,除非粒子的變化依賴於另一個(我想他們會這樣做),在這種情況下,您仍然需要對更新進行排序,在這種情況下,多線程看起來並不像來幫你。 – Elemental