C语言 停止处于睡眠状态的pthread

wn9m85ua  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(169)

我有一个线程(这是一个C实现的Pthread),它每5秒从一个文件读取一个值。在关机过程中,这会导致一个问题,关机进程想删除线程,但由于它正在休眠,它必须等待5秒的休眠完成,然后删除。我如何停止线程,即使它在休眠中,只要我得到关机信号?
我已经有了一个条件变量,只有当条件为真(即线程正在运行)时线程才会休眠。
场景-线程一进入睡眠状态,就收到关闭信号;我们没有办法继续下去,只能等待睡眠完成。

if (isThreadRunning == true) 
{
    sleep(5)
}

一旦接收到关闭信号,条件变量就被设为false,但即使在这种情况下,信号也有可能在第1秒之后出现,我们需要再等待4秒
条件变量的使用...

um6iljoc

um6iljoc1#

即使线程处于睡眠状态,我如何在收到关闭信号后立即停止它?
有几种方法可以解决这个问题。
1.这个线程实际上 * 需要 * 加入吗?
如果没有,只需在主线程中调用exit,此线程将消失在void中。
这种方法的问题是,可能有一些必要的清理,这个线程必须执行。
1.不要调用sleep(5),而是使用pthread_cond_timedwait,条件是“线程应该继续运行”。
pthread_cond_timedwait返回时,检查条件。如果为真,则从文件读取数字并返回pthread_cond_timedwait。如果为假,则从线程函数返回。
主线程应该发出条件信号,然后加入线程。
请注意,可能会出现伪唤醒,因此您还应该检查自上次读取文件以来是否已经过去了5秒。
1.使用usleep(1000)代替sleep(5)。当usleep返回时,首先检查是否应该继续运行,如果是,从上次读取文件以来是否已经过去了5秒。
这种解决方案是一种“忙碌等待”--线程将比必要的时间唤醒更多的时间。
但它很简单,并且将关机时的最长延迟限制在1 ms以内。

相关问题