include: co/co.h.
#co::chan
template<typename T> class chan;
co::chan
是一个模板类,它类似于 golang 中的 channel,用于在协程之间传递数据。
从 v3.0.1 开始,co::chan
可在协程或非协程中使用,且可存储std::string
等非 POD 类型的值。
#constructor
1. explicit chan(uint32 cap=1, uint32 ms=(uint32)-1);
2. chan(chan&& c);
3. chan(const chan& c);
- 1, 参数 cap 是内部队列的最大容量,默认是 1,参数 ms 是读写操作的超时时间,单位为毫秒,默认为 -1,永不超时。
- 2, 移动构造函数。
- 3, 拷贝构造函数,仅将内部引用计数加 1。
#close
void close() const;
- 关闭 channel,关闭后 channel 不可写,但可读。
#done
bool done() const;
- 判断读、写操作是否成功完成。
#operator bool
explicit operator bool() const;
- 若 channel 为关闭状态,返回 false,否则返回 true。
#operator«
chan& operator<<(const T& x) const;
chan& operator<<(T&& x) const;
- 写入元素
x
。 - 此方法会阻塞,直到写入操作完成或超时。可以调用 done() 方法判断写操作是否成功完成。
- 若 channel 已关闭,写操作会失败,此方法立即返回。
#operator»
chan& operator>>(T& x) const;
- 读取元素。
- 此方法会阻塞,直到读取操作完成或超时。可以调用 done() 方法判断读操作是否成功完成。
- 若 channel 已关闭且 channel 中无元素可读时,读操作会失败,此方法立即返回。
#代码示例
#include "co/co.h"
#include "co/cout.h"
void f() {
co::chan<int> ch;
go([ch]() { ch << 7; });
int v = 0;
ch >> v;
co::print("v: ", v);
}
void g() {
co::chan<int> ch(32, 500);
go([ch]() {
ch << 7;
if (!ch.done()) co::print("write to channel timeout..");
});
int v = 0;
ch >> v;
if (ch.done()) co::print("v: ", v);
}
int main(int argc, char** argv) {
flag::parse(argc, argv);
f();
g();
return 0;
}