C 如何调试来自多线程/intr的打印

C 如何调试来自多线程/intr的打印,c,linux,multithreading,C,Linux,Multithreading,我试图通过在多个interruptssoftware中添加打印来进行调试。我看到两个线程的打印重叠 我想打印一些时间/刻度,以确保两个线程同时运行 我用的是jiffies,但当时我没有得到合适的零钱。对于多个中断,我看到了相同的标记。这是标记为linux的,因此我将给您一个linux不可移植的答案,因为据我所知,没有一种真正可移植的方法来实现这一点: 您可以使用pthread_self并打印它。它是一种不透明类型,但您可以将其强制转换为空*并且在Linux上可以工作,前提是您的唯一目的是区分线程

我试图通过在多个interruptssoftware中添加打印来进行调试。我看到两个线程的打印重叠

我想打印一些时间/刻度,以确保两个线程同时运行


我用的是jiffies,但当时我没有得到合适的零钱。对于多个中断,我看到了相同的标记。

这是标记为linux的,因此我将给您一个linux不可移植的答案,因为据我所知,没有一种真正可移植的方法来实现这一点:

您可以使用pthread_self并打印它。它是一种不透明类型,但您可以将其强制转换为空*并且在Linux上可以工作,前提是您的唯一目的是区分线程-不要将其用于任何其他用途

您可以使用gettid,它是一个特定于Linux的调用,用于获取与Linux下的线程关联的进程号。没错,Linux下的每个线程都有一个“隐藏”PID,getId返回它。这是可以让ps显示的线程ID。这稍微不那么恶心


确保所做的调用是线程安全的。sprintf还可以。syslog绝对不是线程安全的,我已经被它咬了一口。因此,许多人需要一个互斥来保护它。

或者,如果需要,可以使用线程id来区分。要添加到前面的注释中,可以使用pthread_self;获取线程ID。这是区分两种语言的最好方法之一threads@kwiermanthreadID是不透明的。虽然可以使用pthread_equal函数比较2个threadid,但它实际上不能用于打印来区分线程。您想做什么?测量时间还是只想知道线程是否同时运行?@rowan.G printf%lu,pthread_self;应该可以在Linux上工作,并且它可以真正用于调试,当它是错误的格式说明符时,编译器应该对您大喊大叫。值得注意的是printf不是可重入的,这意味着您不能在中断处理程序中安全地调用它。请参阅man 7信号以查找要调用的安全函数列表。虽然write被认为是一个安全的函数,这意味着你可以用它来写stdout,如果你还没有这样做的话。我认为他是从线程调用它,而不是从信号处理程序调用它。printf是线程安全的,因为stdio是线程安全的。但我已经添加了一条评论。