gpt4 book ai didi

c - 单个线程中函数调用的跟踪,似乎没有按预期顺序进行

转载 作者:行者123 更新时间:2023-12-05 01:24:50 26 4
gpt4 key购买 nike

我有一个线程,它执行一个函数调用,

 Thread 1()
{
while(1)
{
msg = msgreceive();
condn= msg->condn;
switch(condn)
{
case 0:
//do sonmething
break;
case 1:
printf("case_1");
function2()
break;
}
}
}

function 2()
{
printf("fn2_Start");
//Do something
function 3();
printf("fn2_end");
}

fucntion3()
{
printf("fn3_Start");
//Do something
printf("fn3_end");
}

通常我通过这种方式获取 printf 跟踪,

case_1
fn2_Start
fn3_Start
fn3_end
fn2_end
case_1
fn2_Start
fn3_Start
fn3_end
fn2_end
....
....
...

但从长远来看,有时我会这样得到痕迹

case_1
fn2_tart
fn2_start
fn2 start
case 1
case 1

这是嵌入式 RTOS 设备环境。(MQX) 语言 - C无论如何,我们是否可以怀疑为什么系统会以这种方式运行。当系统负载很重且内存使用率约为 93% 时,就会发生这种情况。

最佳答案

如果 stdout 流在设备驱动程序级别被缓冲并且 outout 由中断处理,那么当缓冲区已满时,如果它被设计为简单地丢弃字符而不是执行阻塞 I/O,那么这将导致输出中丢失字符。

如果是这样,那么实际执行是按照正常顺序进行的(Occam 的 Rasor 更确切地说是这样),但是一些跟踪输出只是丢失了。格式错误的 fn2_tart 输出可能支持这一假设。

使用“printf”作为跟踪方法不是非侵入式。它既可以影响代码的运行方式,也可以受其影响。如果高 CPU 负载周期相对较短,则增加缓冲区大小可能会有所帮助,但如果它们一直持续下去,则没有缓冲量可以解决问题。

关于c - 单个线程中函数调用的跟踪,似乎没有按预期顺序进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9362611/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com