- 論壇徽章:
- 2
|
先說coroutine的狀態(tài)
我上面的帖說coroutine必須提供一個機制來區(qū)分ternimate和yield。
lua有多返回值, 而python除了多返回值, 還有異常。
可能沒說清楚, 我再說具體一點。
1. 代碼中確實有個錯誤, 在10次調用后
2. 不是說C語言就解決不了這個問題
C確實不支持多返回值, 但需要多返回值時, C肯定有迂回的辦法:
- struct { T1 y1; T2 y2; } f(P x);
- void f(P x, T1* y1, T2* y2);
復制代碼 就是ugly而已。
一般情況下, 我設計api時都會盡可能不使用傳出參數(shù), 但有時候真沒辦法。
再看啟動函數(shù)
留意上面的- coroutine_create( ..., void (*f)(void* x), void* x);
復制代碼 結合- pthread_create( ..., void* (*f)(void* x), void* x);
復制代碼 這是C語言另一個問題: 沒有一種參數(shù)類型可以直接代表任意"函數(shù)參數(shù)"。
當需要的時候, 上面就是一個典型的迂回方式。
注意偽代碼中, rc4_stream是unsigned char rc4_stream(char const* key, size_t len);
而實際代碼中, rc4_stream需要是void rc4_stream(void* x);
范化的解決辦法就是:
- typedef struct
- {
- char const* key;
- size_t len;
- } rc4_arg_t;
- void rc4_stream(void* x)
- {
- rc4_arg_t* arg = (rc4_arg_t*)x;
- rc4_stream(arg->key, arg->len);
- }
- rc4_arg_t arg = { "1212", 4 };
- coroutine_create( ..., &arg);
復制代碼 實際代碼中只是取巧使用strlen來減少一個參數(shù)。
對更一般的例子, 就必須迂回一次。
最后看yield的返回值
yield返回什么?
為了讓那幾個coroutine的api更范化一點, 我選擇和pthread相同的, 返回void*。
若需要的返回值比void*窄, 直接通過void* 的值返回。
否則返回一個指向結構體的指針 —— 對更復雜的例子, 就需要再如此這般的迂回一次, 運氣不好還需要動態(tài)分配。
所有的這些加起來, 得到的結果就是在C中使用coroutine會非常麻煩, 能避免,就盡量避免。 |
|