libgo icon indicating copy to clipboard operation
libgo copied to clipboard

why crash?

Open sepcity opened this issue 5 years ago • 5 comments

#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最新代码编译的库

sepcity avatar Feb 13 '20 15:02 sepcity

这段代码没有问题的,我自己也测试下也没问题;

SunnyChenkang avatar Sep 27 '20 12:09 SunnyChenkang

~LockedChannelImpl() {
    DebugPrint(dbg_mask_ & dbg_channel, "[id=%ld] Channel destory.", this->getId());

    assert(lock_.try_lock());
}

是不是这段try_lock()会崩溃 ? 你是怎么解决的

wangqiangnpq avatar Oct 22 '20 09:10 wangqiangnpq

崩溃说明没用对,还有地方在使用就析构了

yyzybb537 avatar Oct 22 '20 09:10 yyzybb537

如果我想要把异步的东西当作同步在调用,我得申请chan并且管理它么,因为我没看到 yield对应的resume接口在哪。

wangqiangnpq avatar Oct 23 '20 01:10 wangqiangnpq

~LockedChannelImpl() {
    DebugPrint(dbg_mask_ & dbg_channel, "[id=%ld] Channel destory.", this->getId());

    assert(lock_.try_lock());
}

是不是这段try_lock()会崩溃 ? 你是怎么解决的

这个问题是因为在debug模式下assert语句会执行。在析构函数中对lock_加锁成功以后,析构函数正常进行,最后会把成员变量lock_销毁,但是此时lock_是上锁状态,导致throw 异常。把这句注释掉就可以了。

Invisible-Boy avatar Mar 24 '21 10:03 Invisible-Boy