libgo
libgo copied to clipboard
why crash?
#include "coroutine.h"
#include "win_exit.h"
#include <stdio.h>
co_chan<int> ch_0;
int main(int argc, char** argv)
{
go [=]{
ch_0 << 1;
};
std::thread([]{ co_sched.Start(); }).detach();
int i = 0;
ch_0 >> i;
co_sched.Stop();
return 0;
}
因为我想验证外部线程与协程之间交换数据 我简单改了下示例三里面的代码, 不太理解为什么程序结束的时候会崩溃?? 我是在windows平台下, 使用master最新代码编译的库
这段代码没有问题的,我自己也测试下也没问题;
~LockedChannelImpl() {
DebugPrint(dbg_mask_ & dbg_channel, "[id=%ld] Channel destory.", this->getId());
assert(lock_.try_lock());
}
是不是这段try_lock()会崩溃 ? 你是怎么解决的
崩溃说明没用对,还有地方在使用就析构了
如果我想要把异步的东西当作同步在调用,我得申请chan并且管理它么,因为我没看到 yield对应的resume接口在哪。
~LockedChannelImpl() { DebugPrint(dbg_mask_ & dbg_channel, "[id=%ld] Channel destory.", this->getId()); assert(lock_.try_lock()); }
是不是这段try_lock()会崩溃 ? 你是怎么解决的
这个问题是因为在debug模式下assert语句会执行。在析构函数中对lock_加锁成功以后,析构函数正常进行,最后会把成员变量lock_销毁,但是此时lock_是上锁状态,导致throw 异常。把这句注释掉就可以了。