- 论坛徽章:
- 2
|
先说coroutine的状态
我上面的帖说coroutine必须提供一个机制来区分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时都会尽可能不使用传出参数, 但有时候真没办法。
再看启动函数
留意上面的- coroutine_create( ..., void (*f)(void* x), void* x);
复制代码 结合- pthread_create( ..., void* (*f)(void* x), void* x);
复制代码 这是C语言另一个问题: 没有一种参数类型可以直接代表任意"函数参数"。
当需要的时候, 上面就是一个典型的迂回方式。
注意伪代码中, 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来减少一个参数。
对更一般的例子, 就必须迂回一次。
最后看yield的返回值
yield返回什么?
为了让那几个coroutine的api更范化一点, 我选择和pthread相同的, 返回void*。
若需要的返回值比void*窄, 直接通过void* 的值返回。
否则返回一个指向结构体的指针 —— 对更复杂的例子, 就需要再如此这般的迂回一次, 运气不好还需要动态分配。
所有的这些加起来, 得到的结果就是在C中使用coroutine会非常麻烦, 能避免,就尽量避免。 |
|