我有一個C++字符分析函數,它被寫入在它自己的線程中運行。它的目的是在每次需要更多數據進行處理時進行阻止調用,並且在處理所有數據之前永遠不會返回。是這樣的:把一個無狀態的C++函數翻出來,變成一個有狀態的函數
void runParser() {
while(true /*returns only when EOF encountered*/) {
//...
c = getNext(); //blocking call
//...
//...
c = getNext(); //blocking call
//...
//...
c = getNext(); //blocking call
//...
//...
//...
c = getNext(); //blocking call
//...
//...
c = getNext(); //blocking call
//...
//...50 more lines of code...
}
}
功能在此阻塞調用用於輸入這些不同的方案的多種下不同的解釋的情況下散落。
我需要把功能從裏面翻出來。我不需要一個單一的等待輸入的單片函數,而是需要一個函數,我可以同步調用它來處理新數據的每一個位。這意味着解析器代碼需要從無狀態變爲記憶狀態。我需要儘可能快地修改代碼。
我的初步想法是修改功能如下:
與靜態的(所以函數保留狀態)
用一個return語句,由之前更換阻塞調用替換局部變量「當前代碼位置」變量的分配。
當新輸入可用時,再次使用新數據調用該函數。
該功能的開始使用
switch()
和一堆goto
s跳回到其以前的位置。
任何人都可以提出一個更優雅,更少雜亂,也許不涉及轉到的替代方案嗎?例如,C++對於實現這些'有狀態返回'具有什麼其他用途?
也許像setjmp/longjmp?除此之外,我認爲沒有固有的方式來保持這種模式。如果只有C++有monads ... –
還有一個整潔的協程庫文件http://www.boost.org/doc/libs/1_53_0/libs/coroutine/doc/html/index.html –