线程的代码有多长时间被执行?

时间:2016-10-28 13:40:16

标签: multithreading pthreads scheduling fwrite

我的程序中有3个主题

T1 读取数据的frame1和 将其写入硬盘

T2 读取数据的frame2和 将其写入硬盘

T2 读取数据的frame3和 将其写入硬盘

当程序运行,并且t1 t2和t3被安排逐个执行时,如何在内部执行操作?

例: 说t1 - > t2 - > t3按此顺序安排

场景1: 将t1完成读取帧1的一个完整周期并在调度t2之前写入帧1,以及t2是否完成读取帧2的一个完整周期并在调度t3之前写入帧2等等?

场景2: 在下一个线程被调度之前,是否可以在执行过程中停止t1或t2或t3或这些线程执行中的少数或全部?

以下哪种情况是正确的?

我特别提到硬盘写入,因为有可能阻塞fwrite调用,不能将其留在执行过程中

2 个答案:

答案 0 :(得分:2)

您应该考虑(以及代码和思考),好像所有线程同时运行(例如,在处理器的不同内核上同时运行)。

线程通常不直接写入磁盘:它正在将文件写入某些file system(并且内核正在缓冲,例如在page cache中,因此磁盘IO可能会发生几秒钟更高版本)。

如果您需要synchronization,则应明确 (例如使用mutexes)。如果您需要同步文件内容,请考虑使用某些file locking机制àlalockf(3)(但您应该避免让多个线程或进程访问和编写同一文件)。 BTW stdio 已缓存(因此您可能希望在fflush(3)之后fwrite(3) ...)

当内核为scheduling某个线程或进程时,它会在任意时间(任意preemptively)安排machine instruction

阅读一些pthread tutorialOperating Systems: Three Easy Pieces。另请阅读memory models棘手)。

所以你所有的场景可能 错误

  

线程的代码在安排好的时候会被执行多少?

你不应该在意,你也不会知道。它可以像没有任何东西一样小(阅读thrashing),也可以是几百万台机器指令。顺便说一句,请注意C中的optimizing compilerssequence points;所以实际上这个问题甚至没有意义(从C程序员的可观察角度来看)。

  

我特别提到硬盘写入,因为有可能阻塞fwrite调用

stdio 库(或直接你的应用程序)实际上write(2) - file descriptor时,内核可能会(但不确定)安排任务在这样的system calls期间。但是,实际的磁盘IO可能会在稍后发生。

PS。另请阅读undefined behavior

答案 1 :(得分:1)

这取决于这些线程正在调用的方法(或方法)。如果所有这些线程都调用相同的方法,并且该方法是同步的,那么一次只有一个线程将处理它。在此期间,其余的线程将等待当前正在运行的线程完成。如果未同步或线程正在调用不同的方法,则无法保证首先处理哪个线程或首先完成。它们也可能最终覆盖类级变量。