armink / EasyLogger

An ultra-lightweight(ROM<1.6K, RAM<0.3k), high-performance C/C++ log library. | 一款超轻量级(ROM<1.6K, RAM<0.3k)、高性能的 C/C++ 日志库

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

异步输出可能导致日志输出不完整

z0306c opened this issue · comments

EasyLogger/src/elog_async.c:
开启ELOG_ASYNC_OUTPUT_USING_PTHREAD情况下,主线程创建线程完成后,才将init_ok设置为true.如:
#ifdef ELOG_ASYNC_OUTPUT_USING_PTHREAD
pthread_attr_t thread_attr;
struct sched_param thread_sched_param;

sem_init(&output_notice, 0, 0);
......
**pthread_create(&async_output_thread, &thread_attr, async_output, NULL);**
......

#endif
//此时,子线程极有可能已经开始执行async_output,而在async_out一开始就断言init_ok为false,
如: ELOG_ASSERT(init_ok); 子程序就有可能再也没有机会执行后边的sem_wait了。
init_ok = true;

最后,只会输出 level < OUTPUT_LVL内容了。

取消 ELOG_ASSERT(init_ok); 断言,或者你还有其他什么解决思路吗?

取消 ELOG_ASSERT(init_ok); 断言,或者你还有其他什么解决思路吗?

我现在就是删掉这里的断言解决的,这里应该也不需要断言的吧

或者就先改为下面方式吧,方便提个 pr 上来吗?

if (!init_ok) {
    return;
}

或者就先改为下面方式吧,方便提个 pr 上来吗?

if (!init_ok) {
    return;
}

这种操作不行的。这样做,子线程就直接退出了,仍然会出现日志输出不完整的问题。这地方不需要对init_ok做判断,因为while循环里有sem_wait,如果没有内容需要输出,就自然等待了

或者就先改为下面方式吧,方便提个 pr 上来吗?

if (!init_ok) {
    return;
}

已经提了一个PR给您

好的,感谢你的贡献哈~~