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函數可以正常工作。但我無法獲得正確的線程上下文。我很困惑。希望有人能幫助我。謝謝。
我們被告知使用這四個上下文切換功能......真的不知道如何調試現在...... :( – user2725837
我對這些getcontext/swapcontext函數做了一些實驗,沒有錯誤。你能粘貼錯誤信息,另一種情況是我們不知道真正出問題的線索,一個線索是你應該先嚐試避免在被調用函數中使用自動變量var,因爲這些自動變量被存儲在寄存器中,其值可以是在swapcontext中發生了意外的變化 – user2760751
謝謝。這段代碼實際上是正確的。我終於發現問題來自於我初始化上下文的部分,無論如何,謝謝。 – user2725837