- 主题:c/c++的开发人员是不是越来越少了?
看看我弄的那个 qtng.org,你会发现很容易掌握。
【 在 allegro (静水流深) 的大作中提到: 】
: coroutine出来后再劝退一波人,余自学c++以来,感觉c++下的coroutine是最难掌握的东西了。
--
FROM 124.72.118.*
是的。很多人不理解,以为可以直接拿来用。其实 c++ 提供的那个东东,是给库的作者用的。一般人不需要学习。
【 在 milksea (肥了,又肥了 >>>_<<<) 的大作中提到: 】
: c++20的协程是个很底层的东西,目前可以说只是半成品,暴露的接口是用来实现 generator 或者 task 的。
--
FROM 124.72.118.*
linux 内核里面一堆的函数指针,跟 c++ 的虚函数一样。
用 c++ 的地方也未必都是高性能。
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: c++现在越来越突出模板编程和编译时优化,我在培训新人的时候,甚至都已经不讲继承和虚函数这些了。用C++的地方都是高性能,虚函数这些是背道而驰。模板编程的编译时优化才是正道
--
FROM 110.81.40.*
代码容量疯狂膨胀。原本用虚函数或者 c 语言 100k 可以搞定的事情,现在编译的 exe 都要十几兆。
【 在 ziqin (子青|会挽雕弓如满月|西北望|射天狼) 的大作中提到: 】
: 可能是行业问题
: 以前写接口都是写个base class + 虚函数,然后让其他人去写实现
: 现在都是用template + type_trait类,以后上了20以后换concept + module
: ...................
--
FROM 112.47.122.*
单纯的 coroutine 没什么用。建议你看看其它语言,比如 python, rust, go 对 corotuine 的使用。在 coroutine 上面还有很多内容要做。比如事件循环和 coroutine 之间的通讯 lock, event, queue 等等。
单纯的 corotuine 有个地方很好用,就是模拟 python 和 javascript 的 yield:
void range(shared_ptr<int> value, coroutine *main)
{
for (int i = 0; i < 100; ++i) {
*value = i;
main->yield();
}
*value = -1;
main->yield();
}
void main()
{
shared_ptr<int> value(new int());
coroutine *generator = new coroutine(range(value, get_current());
do {
generator->yield();
cout << *value;
} while (*value > 0);
}
以上模拟了 python:
for i in range(100):
print(i)
的 c++ 实现。这种 generator 拿来实现 lexer 特别好用。
【 在 ylh1969 (没谱) 的大作中提到: 】
: 本人玩纯C的coroutine,感觉还不错。
: getcontext();之类的
--
修改:hgoldfish FROM 110.85.22.*
FROM 110.85.22.*
你好像还是没理解我说的啊。。
你实现的 coroutine 现在 cpp 已经标准库自带了。你最多再加了一个事件循环。
但根本不够用。需要 lock, event 这些也得实现一下。
【 在 ylh1969 (没谱) 的大作中提到: 】
: 当然。
: 我是用在服务器端的,结合epoll,在需要等待接收时才需要coroutine。
--
FROM 112.47.122.*
python 有协程锁啊。go 的话有 channel 可以通信。总之协程之间也是需要协调的。
举个例子:
同时向三个后端服务器发送请求,任何一条成功则继续。
你打算怎么弄。
【 在 ylh1969 (没谱) 的大作中提到: 】
: 我知道。你说的很对。
: 不管哪个平台,都需要自己包个事件。
: 锁的问题,比较复杂,哪个平台提供了协程锁?
: ...................
--
FROM 110.85.22.*
哦?用的什么原理吗?
我实现的协程 lock, event, condition, semaphore:
https://github.com/hgoldfish/qtnetworkng/blob/master/src/locks.cpp
【 在 ylh1969 (没谱) 的大作中提到: 】
: 这个功能实现了,没用协程锁。
--
FROM 110.85.22.*
有的。我举个栗子。
比如经典的有两个内存里的帐户 A 和 B,一个协程从 A 转帐给 B,另一个协程从 B 转帐给 A,如果是线程,那需要对这两个帐号加锁,让操作串行化。而协程天然是串行化的,在这里不需要加锁。
但是考虑上面那个转钱的动作,加和减都是网络操作。在 A-money 的时候,阻塞住了,另一个协程正在执行 A+money,此时仍然需要加锁。
所以协程减少了锁的使用,但没有锁是万万不行的。
用协程操作界面很爽。比如:
auto r = http.get(url);
updateGUI(r.json());
如果网络操作在线程里面,就没法更新 GUI 了。这里减少了锁的使用。
【 在 hyperLee (老李) 的大作中提到: 】
: 那跟我用线程有什么区别?
--
FROM 140.224.34.*
协程有很多隐藏的好处:
1. 协程可中断(kill/cancel),因为协程阻塞一定发生在IO时。
2. 使用协程组织代码,能有效减少异步调用。写起来更舒服。
3. 因为都是同步调用,所以变量的生命周期非常清晰。进函数构造,出函数销毁。不容易发生泄露。
4. 因为变量生命周期容易管理。所以基本不需要 GC 的存在。引用计数绰绰有余。
5. 变量可以大部分分配在栈。使用 borrow 语义传递给被调用的函数。内存分配更为高效。
简而言之,协程是现在编程语言泥潭的大救星。不支持协程的语言,别学了。
【 在 hyperLee (老李) 的大作中提到: 】
: 那跟我用线程有什么区别?
--
FROM 140.224.34.*