2013-09-11 18 views
2

我們需要實現一個線程庫。但是我真的無法使用yield()函數... 因此,在yield()中,我們需要將當前線程推到就緒線程隊列的末尾,並彈出第一個線程並執行它(FIFO)我正在使用swapcontext()。所以我的代碼就是這樣。使用swapcontext()或getcontext()和setcontext()爲線程庫編寫yield()函數

yield() 
{ 
if(head!=NULL) // if FIFO is not empty, yield to a ready thread` 
{ 
    ready_queue_entry * old_thread= NULL; 
    old_thread = new_thread; 

    Push(old_thread);// push the current one to the FIFO 
    new_thread = Pop();// pop the first one from the FIFO 

    //save the current context and jump to the new thread context. 
    swapcontext(&(old_thread->context),&(new_thread->context)); 
    } 
} 

我確定我的Pop和Push函數可以正常工作。但我無法獲得正確的線程上下文。我很困惑。希望有人能幫助我。謝謝。

回答

0

我已經回答了類似的問題。請參閱this one

嘗試使用「sigsetjmp/siglongjmp」代替。

+0

我們被告知使用這四個上下文切換功能......真的不知道如何調試現在...... :( – user2725837

+0

我對這些getcontext/swapcontext函數做了一些實驗,沒有錯誤。你能粘貼錯誤信息,另一種情況是我們不知道真正出問題的線索,一個線索是你應該先嚐試避免在被調用函數中使用自動變量var,因爲這些自動變量被存儲在寄存器中,其值可以是在swapcontext中發生了意外的變化 – user2760751

+0

謝謝。這段代碼實際上是正確的。我終於發現問題來自於我初始化上下文的部分,無論如何,謝謝。 – user2725837

相關問題